1
1

295 строки
7.1 KiB
C
Исходник Обычный вид История

#include "nbc.h"
#include <unistd.h>
int main(int argc, char **argv) {
NBC_Handle handle1, handle2;
int rank, i,j, res, p;
int *buf1, *buf2, *ptr;
MPI_Init(&argc, &argv);
/* shut up compiler */
handle1 = handle2;
handle2 = handle1;
res = MPI_Comm_size(MPI_COMM_WORLD, &p);
res = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(res != MPI_SUCCESS) printf("Error in MPI_Comm_rank!\n");
buf1=malloc(2*p*sizeof(int));
buf2=malloc(2*p*sizeof(int));
for (i=0; i<1; i++) {
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = rank;
ptr = buf2+j;
*ptr = 0;
}
#if 0
/**************************** BCAST ********************************/
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = rank;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Bcast before: ", rank);
for(j=0;j<p;j++) {
ptr = buf1+j;
printf("%i ", *ptr);
}
printf("\n");
NBC_Ibcast(buf1, p, MPI_INT, 0, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
printf("#[%i] Bcast after: ", rank);
for(j=0;j<p;j++) {
ptr = buf1+j;
printf("%i ", *ptr);
}
printf("\n");
#endif
#if 0
/**************************** GATHER ********************************/
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = rank;
ptr = buf2+j;
*ptr = 0;
}
if(rank ==0) {
printf("#[%i] Gather before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
}
NBC_Igather(buf1, 1, MPI_INT, buf2, 1, MPI_INT, 0, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
if(rank ==0) {
printf("#[%i] Gather after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
}
/**************************** SCATTER ********************************/
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = j;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Scatter before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
NBC_Iscatter(buf1, 1, MPI_INT, buf2, 1, MPI_INT, 0, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
printf("#[%i] Scatter after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
/**************************** ALLGATHER ********************************/
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = rank;
ptr = buf2+j;
*ptr = 0;
}
*buf1 = rank;
printf("#[%i] Allgather before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
NBC_Iallgather(buf1, 1, MPI_INT, buf2, 1, MPI_INT, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
printf("#[%i] Allgather after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
#endif
/**************************** ALLTOALL ********************************/
#if 0
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = j;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Alltoall before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
NBC_Ialltoall(buf1, 1, MPI_INT, buf2, 1, MPI_INT, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
printf("#[%i] Alltoall after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
NBC_Ialltoall(buf1, 1, MPI_INT, buf2, 1, MPI_INT, MPI_COMM_WORLD, &handle1);
NBC_Wait(&handle1);
#endif
#if 0
/**************************** REDUCE ********************************/
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = 1;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Reduce before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
res = NBC_Ireduce(buf1, buf2, p, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD, &handle1);
if(res != NBC_OK) { printf("error in NBC_Ireduce(): %i\n", res); }
NBC_Wait(&handle1);
printf("#[%i] Reduce after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
#endif
/**************************** ALLREDUCE ********************************/
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = 1;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Reduce before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
res = NBC_Iallreduce(buf1, buf2, 2*p, MPI_INT, MPI_SUM, MPI_COMM_WORLD, &handle1);
if(res != NBC_OK) { printf("error in NBC_Iallreduce(): %i\n", res); }
NBC_Wait(&handle1);
printf("#[%i] Reduce after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
#if 0
/**************************** SCAN ********************************/
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = 1;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] Scan before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
res = NBC_Iscan(buf1, buf2, p, MPI_INT, MPI_SUM, MPI_COMM_WORLD, &handle1);
if(res != NBC_OK) { printf("error in NBC_Iscan(): %i\n", res); }
NBC_Wait(&handle1);
printf("#[%i] Scan after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
/**************************** REDUCE_SCATTER ********************************/
printf("#[%i] sbuf: %lu\n", rank, (unsigned long)buf1);
printf("#[%i] rbuf: %lu\n", rank, (unsigned long)buf2);
for(j=0;j<p;j++) {
ptr = buf1+j;
*ptr = j;
ptr = buf2+j;
*ptr = 0;
}
printf("#[%i] reduce_scatter before: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
recvcounts=malloc(p*sizeof(int));
for(j=0;j<p;j++) recvcounts[j] = 1;
res = NBC_Ireduce_scatter(buf1, buf2, recvcounts, MPI_INT, MPI_SUM, MPI_COMM_WORLD, &handle1);
if(res != NBC_OK) { printf("error in NBC_Ireduce_scatter(): %i\n", res); }
NBC_Wait(&handle1);
free(recvcounts);
printf("#[%i] reduce_scatter after: ", rank);
for(j=0;j<p;j++) {
ptr = buf2+j;
printf("%i ", *ptr);
}
printf("\n");
/**************************** END ********************************/
#endif
}
free(buf1);
free(buf2);
MPI_Finalize();
return NBC_OK;
}