【问题标题】:how to parallelize a dot product with MPI如何使用 MPI 并行化点积
【发布时间】:2017-08-20 11:00:40
【问题描述】:

我一直在尝试学习 MPI,并且我有这段来自 C 的代码 sn-p,它应该被格式化为 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 示例......但从那里得到的没有什么用处。

所有帮助将不胜感激..

【问题讨论】:

  • 我猜,你正在寻找类似的东西;)stackoverflow.com/questions/45677220/…
  • 我没有在那个线程中找到足够的答案......如果你问我,这太复杂了。使用 delta 和提醒变量..我相信它可以更容易地简化...

标签: c parallel-processing mpi message-passing


【解决方案1】:

有错别字吗?

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 部分点积以获得最终结果。

【讨论】:

  • 是的,我的意思是 c += 对此感到抱歉...我得到了最近 MPI_SUM 的部分,这可用于获取 SUM...谢谢您但是我的代码怎么样?我对我如何对发送和接收部分进行编程以及是否正确完成感兴趣
  • 您的 MPI_Send()MPI_Recv() 显然是错误的,因为 MPI_Status 是一种类型。在接收中应该替换为status,发送中没有这样的东西。 C 是一个标量,因此您无法接收 10000 MPI_INT。如果你想发送完整的数组A,你可以MPI_Send(A, 10000, MPI_INT, dest, tag, communicator)。但你宁愿MPI_Scatter[v]() 它或干脆MPI_Bcast() 它。如果您仍然想使用MPI_Send()MPI_Recv(),请编辑您的帖子,添加一些 cmets 以用简单的英语清楚地解释算法,我会尽力帮助您。
  • 您能否说明如何将其格式化为 MPI?所以我能更好地理解它吗?谢谢
  • 如果您需要有关MPI_Send()MPI_Recv() 的帮助,请用简单的英语描述您的算法。如果您需要MPI_Reduce() 或其他集体的帮助,那么再次请用简单的英语写一个算法,写一点代码,如果失败,那么我会尽力帮助您。如果你只是希望完成你的作业,我能做的最好的帮助你......根本没有帮助你。
  • 我明白了,不,这不像我希望让别人完成我的作业,它可能更多的是我可以反思的代码提示或参考......我的意思是没有太多在互联网上的任何地方从 C -> Mpi 进行代码格式化......所以很难掌握并理解它......如问题中所述......但我只想知道如果我处理这是错误的,而是我应该使用其他一些 MPI 操作?例如 MPI_Bcast() ... 或其他处理格式的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多