下面的MPI程序test.c完成了如下任务:
Rank 0生成了30000个随机浮点数并发送给Rank 1,Rank 1接收来自Rank 0发来的随机数。另外,Rank 0对整个程序进行了计时。
#include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define FIRST_RANK 0 #define SECOND_RANK 1 #define SIZE 30000 #define TAG 100 /* Check the return value of MPI API */ #define CHECK_MPI(err) do{ if((err) != MPI_SUCCESS){ fprintf(stderr, "MPI error %d at file %s line %d.\n", (err), __FILE__, __LINE__); exit(EXIT_FAILURE); }}while(0) void firstRankTask(void) { float *first; first = (float *)malloc(sizeof(float) * SIZE); if(first == NULL){ fprintf(stderr, "Memory is not enough.\n"); exit(EXIT_FAILURE); } int i; srand( (unsigned)time(NULL) ); for(i = 0; i < SIZE; ++i){ first[i] = rand() / (float)RAND_MAX; } printf("\n"); CHECK_MPI( MPI_Send(first, SIZE, MPI_FLOAT, SECOND_RANK, TAG, MPI_COMM_WORLD) ); free(first); return; } void secondRankTask(void) { float *second; second = (float *)malloc(sizeof(float) * SIZE); if(second == NULL){ fprintf(stderr, "Memory is not enough.\n"); exit(EXIT_FAILURE); } MPI_Status status; CHECK_MPI( MPI_Recv(second, SIZE, MPI_FLOAT, FIRST_RANK, TAG, MPI_COMM_WORLD, &status) ); free(second); return; } int main(int argc, char **argv) { int commSize, commRank; CHECK_MPI( MPI_Init(&argc, &argv) ); CHECK_MPI( MPI_Comm_size(MPI_COMM_WORLD, &commSize) ); CHECK_MPI( MPI_Comm_rank(MPI_COMM_WORLD, &commRank) ); clock_t start; if(commRank == FIRST_RANK){ printf("Clock starts.\n"); start = clock(); } switch(commRank){ case FIRST_RANK: firstRankTask(); break; case SECOND_RANK: secondRankTask(); break; } /* synchronization point */ CHECK_MPI( MPI_Barrier(MPI_COMM_WORLD) ); if(commRank == FIRST_RANK){ double wallTime = (double)(clock() - start) * 1000 / CLOCKS_PER_SEC; printf("Wall time: %.2f ms.\n", wallTime); } CHECK_MPI( MPI_Finalize() ); return 0; }
mpicc test.c -o test
编写执行配置文件pgfile:
-n 1 -node node1 ./test -n 1 -node node2 ./test
mpiexec -configfile pgfile
原文:http://blog.csdn.net/warren912/article/details/20311533