如何使用MPI并行化点积

时间:2017-08-20 11:00:40

标签: c parallel-processing mpi message-passing

我一直在努力学习MPI,我从C中获取了这个代码片段,应将其格式化为MPI以使其可以并行化;

// this is a dot product
int A[100000];
int B[100000];
int C=0;

for (int i=0 ; i<100000; i++){
    c += A[i] * B[i];
}

我对使用MPI时如何处理for循环感到困惑,但这是我对练习的回答;

// this is a dot product
int A[100000];
int B[100000];
int C=0;
int rootId = 0;
int  numtasks, taskId, len, partner, message;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);    

for (int i=0 ; i<100000; i++){
    c = A[i] * B[i];

    if(rootId == taskid){
        MPI_Send(&A[100000], &B[100000], MPI_INT, 1, 0, MPP_COMM_WORLD, MPI_Status)

    }else if (rootId < taskId){
        MPI_Recv(C, 100000, MPI_INT, 0, 0, MPP_COMM_WORLD, MPI_Status)
    }

    MPI_Finalize(); return 0;

}

我不确定这是否正确,但我相信我正朝着正确的方向......

关于MPI的问题在于我无法找到如何用循环重写或构造它的好例子 - 在fortran中有一些例子,但这并不是我所熟悉的...... 我只看过MPI中“Hello world”C的简单例子....但是从那里开始没什么用。

所有帮助将不胜感激..

1 个答案:

答案 0 :(得分:0)

是否有拼写错误,你的意思是吗?

for (int i=0 ; i<100000; i++){
    c += A[i] * B[i];
}

并行化在很大程度上取决于数组AB的分布方式。

最简单的情况,即内存占用最大的情况,是在所有MPI任务上拥有完整的数组AB。 根据任务等级和任务总数,每个任务可以计算点积的一部分,例如

for (int i=start; i<end; i++) {
    c += A[i] * B[i];
}

然后你可以MPI_Reduce()/MPI_Allreduce()使用MPI_SUM部分点积来获得最终结果。