1

这确实是这个问题的后续,因为我认为我已经解决了原始问题提出的问题,但现在还有一些其他问题。

我有一些 MPI 代码正在执行矩阵转置。它通过使用 MPI_Isend 和 MPI_Irecv 的点对点非阻塞通信来执行此操作。我正在使用双打,我所有的 MPI 代码都使用 MPI_DOUBLE 作为类型。然而,我似乎遇到了一些奇怪的记忆问题——其中关键的一个是在我的输出中包含了“无意义”的数字。例如:

Test Process (2, 1): 68.000000 78.000000 
Test Process (2, 1): 387323398486945739062068424931898425134839058804189460794109462554519403357109477747039490936107027309191462010675537134594564349232145421118587860238537662203953149049188364045280831238661272720084252520359127715290869606638545797120.000000 881150864511763756676254370742733018389256944202962553716402946507192139671624750374865205489904045881646541419557063427368973644261533211221769931916194052019466643963904.000000 
Test Process (2, 1): 78.000000 88.000000 

我可以猜到不知何故存在内存问题 - 我正在读取一些内存作为双倍,而不是当它不是时作为双倍写入内存。知道如何进行调试吗?

该代码可在此处获得,但我不希望对代码进行详细分析,更多关于如何使用 MPI 通信发生此类错误的提示,以及我可以做些什么来追踪错误。

只是为了确认我尝试过的几件事:数组的初始化不是问题。我已经尝试将数组初始化为一个已知值(999)并且最后没有出现在数组中,所以显然所有新值(包括疯狂的值)都来自 MPI 通信。

有任何想法吗?

4

1 回答 1

1

一个潜在的问题是array. 在第 223 行,看起来 i 和 j 可能是倒退的。(我不确定在这个 iPod Touch 中查看它的行号是否匹配。它是带有注释“计算偏移量”的循环)与其他循环相比,j 和 i 被交换为列的行。看来您已经在评论中调整了几种不同的方式……所以也许这是意料之中的。我不能很好地看到整个代码,因为我目前使用的是视野有限的 iPod touch。但这部分似乎确实不正确。

最后的循环似乎也不正确。与其他循环相比,其中一个 j 和 i 也是相反的。

于 2011-04-09T22:07:32.733 回答