[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
There are several example `TOP-C' programs in the
`topc/examples' subdirectory. We include one example in this
manual. It does not contain any UPDATE
actions, and therefore
illustrates only a trivial form of parallelism (with no interaction
among the slaves). The `topc/examples' subdirectory should be
inspected for more sophisticated examples.
After understanding this example, you may also want to look at
8. Advanced Features of `TOP-C', or if you are parallelizing a sequential
program, then you may want to look at 9. `TOP-C' Raw Interface for Parallelizing Sequential Code.
This program produces an array of 10,000,000 random integers in one pass,
and then finds the maximum value in a second pass. It would be compiled
by: topcc MODE `file.out'
, where MODE is one of
--seq
, --mpi
, or --pthread
. One can control the
number of slaves by executing: ./a.out --TOPC-num-slaves=num
.
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <topc.h> #define MAX 2000000 #define INCR MAX/10 /* We assume INCR divides MAX exactly */ int array[MAX]; int idx; int max_int; TOPC_BUF GenerateTaskInput() { int input_task; if (idx >= MAX) return NOTASK; input_task = idx; idx = idx + INCR; return TOPC_MSG( &input_task, sizeof(input_task) ); } TOPC_BUF DoTaskRandom( int *ignore ) { int rand_int[INCR]; int i; for ( i = 0; i < INCR; i++) rand_int[i] = rand(); return TOPC_MSG( rand_int, INCR * sizeof(int) ); } TOPC_ACTION CheckTaskRandom( int *input, int rand_vals[] ) { int curr_idx = *input; memcpy( array+curr_idx, rand_vals, INCR * sizeof(int) ); return NO_ACTION; } TOPC_BUF GenerateTaskInMax() { int *input_task; if (idx >= MAX) return NOTASK; input_task = array + idx; idx = idx + INCR; return TOPC_MSG( input_task, INCR * sizeof(int) ); } TOPC_BUF DoTaskMax( int subarray[] ) { int i; int max=0; for ( i = 0; i < INCR; i++) if ( subarray[i] > max ) max = subarray[i]; return TOPC_MSG( &max, sizeof(max) ); } TOPC_ACTION CheckTaskMax( int ignore[], int *output ) { int curr_max = *output; if ( curr_max > max_int ) max_int = curr_max; return NO_ACTION; } int main( int argc, char **argv ) { /* Set default to no trace; Override with: ./a.out --TOPC-trace=1 */ TOPC_OPT_trace = 0; TOPC_init( &argc, &argv ); idx = 0; /* Initialize idx, and randomize values of array[] */ TOPC_master_slave(GenerateTaskInput, DoTaskRandom, CheckTaskRandom, NULL); if (TOPC_is_master()) printf("Finished randomizing integers.\n"); idx = 0; /* Re-initialize idx to 0, and find max. value in array[] */ TOPC_master_slave( GenerateTaskInMax, DoTaskMax, CheckTaskMax, NULL ); TOPC_finalize(); printf("The maximum integer is: %d\n", max_int); exit(0); } |
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |