【发布时间】:2017-06-25 08:34:11
【问题描述】:
我在这里看到了许多类似的线程,但我的问题是,我的程序实际上是针对不同的设置运行的。
例如:当我的矩阵是1024x1024
对于 2 个内核:错误 11
对于 4、8、16 等都可以正常工作。
矩阵2048x2048:
对于任何核心设置:错误 11。
我不明白为什么会这样,每个进程都需要一个 2048/(总进程)X 2028 矩阵来计算。它应该可以正常工作。
这就是我声明我的矩阵的方式:
int temp[wp][hp];
接收:
rc = MPI_Recv(&temp[0][0], wp*hp, MPI_INT, i, tag, MPI_COMM_WORLD, &status);
对于发送:
rc = MPI_Send(&temp[0][0], wp*hp, MPI_INT, 0, tag, MPI_COMM_WORLD);
我不明白,它应该可以工作。您是否认为这可能是内存问题而不是指针相关?
【问题讨论】:
-
C 和 C++ 是两种不同的语言。如果
wp和/或hp是变量,则:int temp[wp][hp];不是合法的C++。 -
另外,
2048 * 2048 * sizeof(int)-- 考虑这相当于什么,以及您的数组是在本地还是全局声明的。如果是本地的。你可能会炸毁堆栈。 -
@PaulMcKenzie 是 C,你是对的。我不太清楚你所说的全球或本地是什么意思。
temp它在 main() 中声明,每个进程都可以访问它;如果我们有 8 个进程,这个矩阵应该是 256x2048。最终的矩阵称为im,它是 2048x2048,每个进程都可以访问,但实际上只有主进程最终会使用它。 -
tempIt 在 main() 中声明——嗯,这可能是问题所在。您在本地声明数组,因此使用堆栈空间。我怀疑你有 16 兆字节的堆栈空间。而是使用动态分配(例如
malloc)。 -
@PaulMcKenzie 好的,我是 C 新手(我什至认为 C++ 也一样)我更喜欢 java、python 和 matlab,所以我很难掌握这一点。我应该在 main() 之外分配一些空间还是分配一些空间(如何)?
标签: c pointers parallel-processing mpi