这确实是这个问题的后续,因为我认为我已经解决了原始问题提出的问题,但现在还有一些其他问题。
我有一些 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 通信。
有任何想法吗?