我试图两个阵列(每个长度为n的)组合成上根处理接收缓冲器缓冲器地址(秩= 0),以形成长度为2 * n个,即一个单一的阵列的阵列包含所有的值。MPI减少到特定接收
为了简便起见,我的代码如下所示:
#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中被设置为0,然后用MPI_SUM减少将使所需的答案
我抬起头文件,一些教程/在线指南,当然,我仍然无法弄清楚我做错了什么。
一个答案,我专门找:
- 使用MPI_Reduce这是技术上是可行的?
- 我的MPI_Reduce调用是否正确? (指针算术错误?)
- 使用MPI是可行/正确的做法还是更好的方法?
感谢
我想我应该尝试使用MPI_Gather,可能会简化/修复问题 – xlm