下面的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