| 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, val; 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 = (double)mype;
|
|---|
| 17 |
|
|---|
| 18 | #ifdef TYPE
|
|---|
| 19 | if(mype%2)
|
|---|
| 20 | ierr = MPI_Allreduce(&val, &sum, knt, MPI_DOUBLE, MPI_SUM, WCOMM);
|
|---|
| 21 | else
|
|---|
| 22 | ierr = MPI_Allreduce(&val, &sum, knt, MPI_INT, MPI_SUM, WCOMM);
|
|---|
| 23 | #elif defined OPERATOR
|
|---|
| 24 | if(mype%2)
|
|---|
| 25 | ierr = MPI_Allreduce(&val, &sum, knt, MPI_DOUBLE, MPI_SUM, WCOMM);
|
|---|
| 26 | else
|
|---|
| 27 | ierr = MPI_Allreduce(&val, &sum, knt, MPI_DOUBLE, MPI_MAX, WCOMM);
|
|---|
| 28 | #else
|
|---|
| 29 | ierr = MPI_Allreduce(&val, &sum, knt, MPI_DOUBLE, MPI_SUM, WCOMM);
|
|---|
| 30 | #endif
|
|---|
| 31 |
|
|---|
| 32 | calc = ((npes - 1) * npes) / 2;
|
|---|
| 33 | printf(" PE: %d sum=%5.0f calc=%d\n", mype, sum, calc);
|
|---|
| 34 | #ifdef _CIVL
|
|---|
| 35 | #ifndef OPERATOR
|
|---|
| 36 | $assert(sum == calc);
|
|---|
| 37 | #endif
|
|---|
| 38 | #endif
|
|---|
| 39 | ierr = MPI_Finalize();
|
|---|
| 40 | }
|
|---|