#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;
}
-#ifdef DEBUG_REDUCE
+//#ifdef DEBUG_REDUCE
/**
* debugging helper function
**/
-static void print_buffer_int(void *buf, int len, const char *msg, int rank)
+static void print_buffer_int(void *buf, int len, char *msg, int rank)
{
int tmp, *v;
printf("**[%d] %s: ", rank, msg);
printf("\n");
free(msg);
}
-#endif
+static void print_buffer_double(void *buf, int len, char *msg, int rank)
+{
+ int tmp;
+ double *v;
+ printf("**[%d] %s: ", rank, msg);
+ for (tmp = 0; tmp < len; tmp++) {
+ v = buf;
+ printf("[%lf]", v[tmp]);
+ }
+ printf("\n");
+ free(msg);
+}
+
+//#endif
/**
* MPI_Reduce
**/
int cnt=0;
int rank;
int tag=0;
- char *cbuf; // to manipulate the void * buffers
+ char *cptr; // to manipulate the void * buffers
smpi_mpi_request_t *requests;
smpi_mpi_request_t request;
smpi_mpi_status_t status;
requests = xbt_malloc((comm->size-1) * sizeof(smpi_mpi_request_t));
if (rank == root) {
- // i am the root: distribute my sendbuf
- for (i=0; i < comm->size; i++) {
- cbuf = sendbuf;
- cbuf += i*sendcount*datatype->size;
- if ( i!=root ) { // send to processes ...
-
- retval = smpi_create_request((void *)cbuf, sendcount,
- datatype, root, i, tag, comm, &(requests[cnt++]));
- if (NULL != requests[cnt] && MPI_SUCCESS == retval) {
- if (MPI_SUCCESS == retval) {
- smpi_mpi_isend(requests[cnt]);
- }
+ // i am the root: distribute my sendbuf
+ //print_buffer_int(sendbuf, comm->size, xbt_strdup("rcvbuf"), rank);
+ cptr = sendbuf;
+ for (i=0; i < comm->size; i++) {
+ if ( i!=root ) { // send to processes ...
+
+ retval = smpi_create_request((void *)cptr, sendcount,
+ datatype, root, i, tag, comm, &(requests[cnt]));
+ if (NULL != requests[cnt] && MPI_SUCCESS == retval) {
+ if (MPI_SUCCESS == retval) {
+ smpi_mpi_isend(requests[cnt]);
+ }
}
cnt++;
}
else { // ... except if it's me.
- memcpy(recvbuf, (void *)cbuf, recvcount*recvtype->size*sizeof(char));
+ memcpy(recvbuf, (void *)cptr, recvcount*recvtype->size*sizeof(char));
}
+ cptr += sendcount*datatype->size;
}
for(i=0; i<cnt; i++) { // wait for send to complete
/* FIXME: waitall() should be slightly better */