/* program app */ #include #include "Tmk.h" struct shared { int sum; int turn; int* array; }* shared; main(int argc, char **argv) { int start, end, i, p; int arrayDim = 100; Tmk_startup(argc, argv); /* Allocate shared memory */ if (Tmk_proc_id == 0) { shared = (struct shared *) Tmk_alloc(sizeof(shared)); if (shared == NULL) Tmk_exit(-1); /* share common pointer with all procs */ Tmk_distribute(&shared, sizeof(shared)); shared->array = (int *) Tmk_malloc(arrayDim * sizeof(int)); if (shared->array == NULL) Tmk_exit(-1); shared->turn = 0; shared->sum = 0; } Tmk_barrier(0); /* Determine array range for each processor */ { int id0 = Tmk_proc_id, id1 = Tmk_proc_id + 1; int perProc = arrayDim / Tmk_nprocs; int leftOver = arrayDim % Tmk_nprocs; start = id0 * perProc + id0 * leftOver / Tmk_nprocs; end = id1 * perProc + id1 * leftOver / Tmk_nprocs; } for (i = start; i < end; i++) shared->array[i] = i; Tmk_barrier(0); /* Print array elements, in the natural output order */ for (p = 0; p < Tmk_nprocs; p++) { if (shared->turn == tmk-proc_id) { for (i = start; i < end; i++) printf("%d: %d\n", i, shared->array[i]); shared->turn++; } Tmk_barrier(0); } /* Compute local sum, then add to global sum */ { int mySum = 0; for (i = start; i < end; i++) mySum += shared->array[i]; Tmk_lock_acquire(0); shared->sum += mySum; Tmk_lock_release(0); } if (Tmk_proc_id == 0) { Tmk_free(shared->array); Tmk_free(shared); printf("Sum is %d\n", shared->sum); } Tmk_exit(0); }