#define MAXLEN 10000
int success = 1;
- int root,i,j,k;
- int out[MAXLEN*64];
- int in[MAXLEN];
-
-
- for(j=1,root=0;j<=MAXLEN;j*=10,root=(root+1)%size) {
- if(rank == root)
- for(i=0;i<j*size;i++) out[i] = i;
+ int root=0;
+ int i,j,k;
+ int *out;
+ int *in;
+
+
+ out = malloc(MAXLEN*64*sizeof(int));
+ in = malloc(MAXLEN*sizeof(int));
+
+ for(j=1;j<=MAXLEN;j*=10){
+ root=(root+1)%size;
+ if (rank == root)
+ for(i=0;i<j*size;i++)
+ out[i] = i;
MPI_Scatter(out,j,MPI_INT,in,j,MPI_INT,root,MPI_COMM_WORLD);
}
}
}
- return( success );
+ free(out);
+ free(in);
MPI_Barrier( MPI_COMM_WORLD );
+ return( success );
}
/**
* small test: the root sends a single distinct double to other processes
**/
int small_test( int rank, int size ) {
- int success=1;
- int sendcount=size;
- int recvcount=1;
- int i;
- double *sndbuf =NULL;
- double rcvd;
- int root=0; // arbitrary choice
-
- // on root, initialize sendbuf
- if (root == rank ) {
- sndbuf = malloc( sendcount*sizeof(double));
- for (i=0; i<sendcount;i++) {
- sndbuf[i] = (double) rank;
- }
- }
-
- MPI_Scatter(sndbuf, sendcount, MPI_DOUBLE, &rcvd,recvcount,MPI_DOUBLE,root,MPI_COMM_WORLD);
-
- return(success);
+ int success=1;
+ int retval;
+ int sendcount=1; // one double to each process
+ int recvcount=1;
+ int i;
+ double *sndbuf =NULL;
+ double rcvd;
+ int root=0; // arbitrary choice
+
+ // on root, initialize sendbuf
+ if (root == rank ) {
+ sndbuf = malloc( size * sizeof(double));
+ for (i=0; i< size;i++) {
+ sndbuf[i] = (double) i;
+ }
+ }
+
+ retval=MPI_Scatter(sndbuf, sendcount, MPI_DOUBLE, &rcvd,recvcount,MPI_DOUBLE,root,MPI_COMM_WORLD);
+ if (retval != MPI_SUCCESS) {
+ fprintf(stderr,"(%s:%d) MPI_Scatter() returned retval=%d\n",__FILE__,__LINE__,retval);
+ return 0;
+ }
+
+ // verification
+ if ((double)rank != rcvd) {
+ fprintf(stderr,"[%d] has %lf instead of %d\n",rank,rcvd,rank);
+ success=0;
+ }
+ return(success);
}
int main(int argc, char **argv)
{
- int size, rank;
+ int size, rank;
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+ MPI_Init(&argc, &argv);
+ MPI_Comm_size(MPI_COMM_WORLD, &size);
+ MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+ /* test 1 */
+ if (0 == rank)
+ printf("** Small Test Result: ... \n");
+ if (! small_test( rank, size ))
+ printf("\t[%d] failed.\n", rank);
+ else
+ printf("\t[%d] ok.\n", rank);
- if (0 == rank)
- printf("** Small Test Result: ... \n");
- small_test( rank, size );
+ MPI_Barrier( MPI_COMM_WORLD );
+ /* test 2 */
+ if (0 == rank)
+ printf("** IBM Test Result: ... \n");
+ if (!ibm_test(rank, size))
+ printf("\t[%d] failed.\n", rank);
+ else
+ printf("\t[%d] ok.\n", rank);
- if (0 == rank)
- printf("** IBM Test Result: ... \n");
-/* if (!ibm_test(rank, size))
- printf("\t[%d] failed.\n", rank);
- else
- printf("\t[%d] ok.\n", rank);
-*/
- MPI_Finalize();
- return 0;
+ MPI_Finalize();
+ return 0;
}