1

元の質問で尋ねられた問題は解決したと思いますが、他の問題がいくつかあります。

行列の転置を行っている MPI コードがあります。これは、MPI_Isend と MPI_Irecv を使用したポイント ツー ポイントのノンブロッキング通信を介して行われます。double を使用していますが、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 

どういうわけかメモリの問題があると推測できます-そうでない場合は一部のメモリをdoubleとして読み取り、そうでない場合はdoubleとしてメモリに書き込みます。これをデバッグする方法はありますか?

コードはこちらから入手できますが、コードの詳細な分析、MPI 通信を使用してこの種のエラーが発生する可能性に関するヒント、およびエラーを追跡するために何ができるかについての詳細は期待していません。

私が試したいくつかのことを確認するために、配列の初期化に問題はありません。配列を既知の値 (999) に初期化しようとしましたが、それは最後に配列に表示されないため、明らかにすべての新しい値 (クレイジーなものを含む) は MPI 通信からのものです。

何か案は?

4

1 に答える 1

1

潜在的な問題の 1 つは、 のインデックス作成に一貫性がないことですarray。223 行目で、i と j が逆になっているようです。(この iPod Touch で表示した場合、行番号が一致しているかどうかはわかりません。「オフセットを計算する」というコメントのあるループです) j と i は、他のループと比較して行と列が入れ替わっています。コメントでいくつかの異なる方法で調整したようです...おそらくそれは予想されることです. 現在 iPod touch を使用しているため、表示が制限されているため、コード全体をよく見ることができません。しかし、その部分は間違っているようです。

また、最後のループも間違っているようです。その1つでは、jとiも他のループと比較して逆になっています。

于 2011-04-09T22:07:32.733 に答える