我正在尝试将两个数组(每个长度为 n)组合到根进程(rank=0)上的接收缓冲区中,以形成一个长度为 2*n 的数组,即包含所有值的单个数组。
为简洁起见,我的代码类似于以下内容:
#define ROOT 0
int myFunction(int* rBuf, int n) {
int* sBuf = malloc(n*sizeof(int));
// Do work, calculate offset, count etc.
MPI_Reduce(sBuf, rBuf+offset[rank], counts[rank],
MPI_INT, MPI_SUM, ROOT, MPI_COMM_WORLD);
}
// where offset[rank] is amount to offset where it is to be received
// offset[0] = 0, offset[1] = n
// counts contains the length of arrays on each process
但是,当我检查 rBuf 时,它会减少为没有偏移量的 rBuf,例如:
// Rank 0: sBuf = {3, 2}
// Rank 1: sBuf = {5, 1}
// Should be rBuf = {3, 2, 5, 1}
rBuf = {8, 3, 0, 0}
附加信息:
- rBuf 被初始化为在减少之前使用 0 值的正确大小
- 所有进程都有偏移数组
- 当时使用 MPI_Reduce 的原因是,如果 rBuf 设置为 0s,那么使用 MPI_SUM 减少将给出所需的答案
我查看了文档、一些在线教程/指南,当然还有 SO,但我仍然无法弄清楚我做错了什么。
对于答案,我特别在寻找:
- 这在技术上是否可以使用 MPI_Reduce?
- 我的 MPI_Reduce 调用是否正确?(指针算术错误?)
- 使用 MPI 是可行/正确的做法还是更好的方法?
谢谢