首页 > 其他 > 详细

MPI基本编程框架

时间:2014-03-04 03:35:13      阅读:460      评论:0      收藏:0      [点我收藏+]

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

MPI基本编程框架,布布扣,bubuko.com

MPI基本编程框架

原文:http://blog.csdn.net/warren912/article/details/20311533

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!