source: CIVL/examples/mpi/routines/Gather_Scatter/mpi_scatter_inPlace.c@ dccd621

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since dccd621 was 0baeebd, checked in by Ziqing Luo <ziqing@…>, 12 years ago

cleaned up examples

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@1776 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 1.3 KB
Line 
1#include "mpi.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <assert.h>
5#define SIZE 4
6
7#ifdef _CIVL
8$input int _NPROCS=4;
9#endif
10
11int main (int argc, char *argv[])
12{
13 int numtasks, rank, sendcount, recvcount, source;
14 float sendbuf[SIZE * SIZE] = {
15 1.0, 2.0, 3.0, 4.0,
16 5.0, 6.0, 7.0, 8.0,
17 9.0, 10.0, 11.0, 12.0,
18 13.0, 14.0, 15.0, 16.0};
19 float recvbuf[SIZE];
20
21 MPI_Init(&argc,&argv);
22 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
23 MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
24
25 if (numtasks == SIZE) {
26 source = 1;
27 sendcount = SIZE;
28 recvcount = SIZE;
29 if(source == rank){
30 // Locally assign recvbuf for root process,
31 // then using MPI_INPLACE for scattring.
32 for(int i=0; i<SIZE; i++)
33 recvbuf[i] = *(sendbuf + rank * SIZE + i);
34 MPI_Scatter(sendbuf,sendcount,MPI_FLOAT,MPI_IN_PLACE,recvcount,
35 MPI_FLOAT,source,MPI_COMM_WORLD);
36 }
37 else
38 MPI_Scatter(sendbuf,sendcount,MPI_FLOAT,recvbuf,recvcount,
39 MPI_FLOAT,source,MPI_COMM_WORLD);
40
41 printf("rank= %d Results: %f %f %f %f\n",rank,recvbuf[0],
42 recvbuf[1],recvbuf[2],recvbuf[3]);
43 //add assertions
44 for(int i=0; i<SIZE; i++)
45 assert(recvbuf[i] == *(sendbuf + SIZE * rank + i));
46 }
47 else
48 printf("Must specify %d processors. Terminating.\n",SIZE);
49
50 MPI_Finalize();
51}
Note: See TracBrowser for help on using the repository browser.