/* simple calling routines to test parallel_sort() routine */ #include #include #include #include #include "mimd.h" #if CAP && HOST #include #endif #define SAVE_SORT 0 #define SINGLE_TEST 0 #define SORT_TEST 0 #define BALANCED 1 #define CHECKSUM 1 /* shall I keeps stats on the sort ? */ #ifndef STATS #define STATS 0 #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif typedef char string[16]; int strcmp(); #if STRING #define TYPE string #define comparison strcmp #else #define TYPE int #define comparison int_comparison #endif #define ELSIZE sizeof(TYPE) #ifdef __GNUC__ int ftime(); int printf(); int srandom(); int random(); int fprintf(); char *getenv(); int atoi(); int fflush(); #endif #if HOST /******************************************************************* wait for a message ********************************************************************/ static void MM_wait_for_message(int node,int useconds) { do usleep(useconds); while (!MIMD_Host_Msg_Pending(node)); } #endif /******************************************************************* sum integers from all nodes to the host ********************************************************************/ static int MM_sum_bc_int(int v) { int sum=0; #if HOST MM_wait_for_message(BOTTOM_NODE,1000); MIMD_Recv(BOTTOM_NODE,&sum,sizeof(sum)); return(sum + v); #else MIMD_Sum_Int(v,&sum); if (IS_BOTTOM_NODE) MIMD_Send_To_Host(&sum,sizeof(sum)); return(sum); #endif } /******************************************************************* broadcast to next node down ********************************************************************/ static void MM_bc(void *data,int size) { #if HOST MIMD_Host_Broad(data,size); #else MIMD_Recv_Broad_From_Host(data,size); #endif } /******************************************************************* broadcast an integer ********************************************************************/ static void MM_bc_integer(int v) { MM_bc(&v,sizeof(v)); } /******************************************************************* broadcast receive an integer ********************************************************************/ static int MM_bc_receive_integer() { int i; MM_bc(&i,sizeof(i)); return(i); } struct timeb tp1,tp2; /******************************************************************* reset the program timer ********************************************************************/ void reset_timer(void) { ftime(&tp1); } /******************************************************************* write the time elapsed since the last reset timer ********************************************************************/ void report_timer(void) { ftime(&tp2); printf("elapsed = %d ms\n",(int)(1000*(tp2.time - tp1.time) + (tp2.millitm - tp1.millitm))); } /******************************************************************* comparison function for integer sort ********************************************************************/ int int_comparison(int *i1,int *i2) { return(*i1 - *i2); } /******************************************************************* seed random number generator ********************************************************************/ void start_random(void) { srandom(time(NULL)*getpid()); } /******************************************************************* generate some values for sort testing ********************************************************************/ int generate_values(int seed,int *pN,TYPE **pd) { int i; int N; srandom(seed*(NUM_NODES + 1) + NODE_NUMBER*131); for (i=0;i0) *pd = (TYPE *)malloc(ELSIZE*N); if (!(*pd)) { /* couldn't alloc - return error */ return 1; } #if STRING { string *d = *pd; for (i=0;i=sizeof(int)) { r = random(); for (k=0;k1) N=atoi(argv[1]); if (argc>2) i=atoi(argv[2]); if (argc>3) factor = atof(argv[3]); printf("sorting %d elements per node %d times with an increment factor of %g\n",N,i,factor); while (i--) { if (sort_test(N) != 0) { printf("Error sorting %d elements\n",N); return 1; } N *= factor; } #else while (sort_test(N) == 0); #endif return(0); }