5

確かに、MPI で 1 つの C 構造体を転送するのに何行のコードが必要かを知って、かなりショックを受けました。

定義済みのデータ型を使用して構造体を単純に送信すると、どのような状況で機能しMPI_CHARますか? 次の例を検討してください。

struct particle {
   double x;
   double y;
   long   i;
};

struct particle p;
MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr);

私の場合、すべてのプロセスが同じアーキテクチャで実行されます。パディングだけが問題ですか?

4

2 に答える 2

8

MPI_BYTE型なしデータを送信するときに使用するデータ型であり、 ではありませんMPI_CHAR。2 つのマシンのアーキテクチャが同じであるが、異なる文字エンコーディングを使用している場合、 を使用MPI_CHARするとデータが破損する可能性があります。データをそのまま送信するMPI_BYTEと、バイナリ表現がそのまま残り、表現変換はまったく実行されません。

そうは言っても、技術的には、データ表現が送信側と受信側で同じになることを保証できる場合(およびその場合にのみ)、構造体をそのように送信することは正しいです。ただし、コードの目的がわかりにくくなり、プラットフォームに依存するようになるため、プログラミングの実践としては適切ではありません。

データ型を定義してコミットする必要があるのは 1 回だけであることに注意してください。通常は、データ型を送信するコードを複数回記述する必要があります。単一の定義で数行を節約するためだけにすべての送信の明瞭度を下げることは、トレードアップではありません。

于 2010-05-04T12:45:38.843 に答える
3

個人的には、パディングよりも、分かりやすさと保守性、さらには移植性に関心があります。構造体を送信する場合、バイトや文字のシーケンスではなく、構造体を送信していることを示すコードが好きです。そして、複数世代の言語標準とコンパイラーにまたがって、複数のアーキテクチャーで自分のコードが実行されることを期待しています。

私が言いたいのは、もし構造を定義する価値があるなら (そしてあなたがそう思っているのは明らかだ)、構造を定義する価値があるということだけだ。(ほぼ) ボイラープレートの数行を節約することは、それに対する大きな議論ではありません。

于 2010-05-02T16:39:38.147 に答える