【发布时间】:2012-11-26 05:44:57
【问题描述】:
我在 C API 中有 double A[B_ROWS][B_COLUMNS]; 我使用过类似的东西:
MPI_Isend(&A[low_bound][0], (upper_bound - low_bound) * A_COLUMNS, MPI_DOUBLE, i, MASTER_TO_SLAVE_TAG + 2, MPI_COMM_WORLD, &request);
和
MPI_Recv(&A[low_bound][0], (upper_bound - low_bound) * A_COLUMNS, MPI_DOUBLE, 0, MASTER_TO_SLAVE_TAG + 2, MPI_COMM_WORLD, &status);
现在with boost::mpi我试试:
world.isend(i, TO_SLAVE_TAG + 2, &A[low_bound][0], (upper_bound - low_bound) * A_COLUMNS);
和
world.recv(0, TO_SLAVE_TAG + 2, &A[low_bound][0], (upper_bound - low_bound) * A_COLUMNS);
但我的应用经常出现以下问题:
rank 1 in job 10 master_39934 caused collective abort of all ranks
exit status of rank 1: killed by signal 11
这意味着seg fault,请注意原始 C 应用程序可以根据需要运行,而我目前更改的只是使用 api - 没有任何逻辑。
那么通过 boost::mpi 发送 2d C 样式数组的正确方法是什么?
【问题讨论】:
-
如果
value参数是可序列化类型会更好。 -
可能是愚蠢的建议:你不应该有
(upper_bound - low_bound + 1) * A_COLUMNS,加上那个+1吗?或者upper_bound==low_bound时有 0 是否正确? -
sscce.org -- 我们能得到一份你的程序的副本,它实际演示了问题并编译了吗?我的意思是,我可以指出
A与A_COLUMNS无关,因为您的A是double A[B_ROWS][B_COLUMNS]类型——注意Bs。但这可能只是您没有真正描述您遇到的问题,而不是代码中的基本问题。