| 1 | #include <mpi.h>
|
|---|
| 2 | #include <stdio.h>
|
|---|
| 3 | #ifdef _CIVL
|
|---|
| 4 | #include<civlc.cvh>
|
|---|
| 5 | #endif
|
|---|
| 6 |
|
|---|
| 7 | #define WCOMM MPI_COMM_WORLD
|
|---|
| 8 |
|
|---|
| 9 | int main(int argc, char **argv){
|
|---|
| 10 | int npes, mype, ierr;
|
|---|
| 11 | double sum[2], val[2]; int calc, knt=1;
|
|---|
| 12 | ierr = MPI_Init(&argc, &argv);
|
|---|
| 13 | ierr = MPI_Comm_size(WCOMM, &npes);
|
|---|
| 14 | ierr = MPI_Comm_rank(WCOMM, &mype);
|
|---|
| 15 |
|
|---|
| 16 | val[0] = (double)mype;
|
|---|
| 17 | val[1] = (double)mype;
|
|---|
| 18 | #ifdef OPERATOR
|
|---|
| 19 | if(mype%2)
|
|---|
| 20 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, 0, WCOMM);
|
|---|
| 21 | else
|
|---|
| 22 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_MAX, 0, WCOMM);
|
|---|
| 23 | #elif defined ORDER
|
|---|
| 24 | if(mype !== 2)
|
|---|
| 25 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, 0, WCOMM);
|
|---|
| 26 | #elif defined TYPE
|
|---|
| 27 | if(mype%2)
|
|---|
| 28 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, 0, WCOMM);
|
|---|
| 29 | else
|
|---|
| 30 | ierr = MPI_Reduce(val, sum, knt, MPI_INT, MPI_SUM, 0, WCOMM);
|
|---|
| 31 | #elif defined ROOT
|
|---|
| 32 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, mype, WCOMM);
|
|---|
| 33 | #elif defined COUNT
|
|---|
| 34 | knt = 2-(mype%2);
|
|---|
| 35 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, 0, WCOMM);
|
|---|
| 36 | #else
|
|---|
| 37 | ierr = MPI_Reduce(val, sum, knt, MPI_DOUBLE, MPI_SUM, 0, WCOMM);
|
|---|
| 38 | #endif
|
|---|
| 39 |
|
|---|
| 40 | calc = ((npes - 1) * npes) / 2;
|
|---|
| 41 | if(mype == 0){
|
|---|
| 42 | printf(" PE: %d sum=%5.0f calc=%d\n", mype, sum[0], calc);
|
|---|
| 43 | #ifdef _CIVL
|
|---|
| 44 | #ifndef OPERATOR
|
|---|
| 45 | $assert(sum[0] == calc);
|
|---|
| 46 | #endif
|
|---|
| 47 | #endif
|
|---|
| 48 | }
|
|---|
| 49 | ierr = MPI_Finalize();
|
|---|
| 50 | }
|
|---|