C语言 如何使用 MPI 并行化点积



我一直在尝试学习 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 的简单示例...... 但从那里没有什么有用的东西。

所有的帮助将不胜感激。

有错别字吗,你的意思是吗?

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

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

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

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

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

最新更新