MPI implementation
実装に関する技術的詳細
データの送信および受信
スクリプト言語によるMPI実装の主な問題は,ネーティブな特徴に起因します.
つまり,スクリプト言語は,もともと,
種々の型
および大きさの動的な変数を用いているのです.
ScilabにおけるMPIの実装はMPIデータ型MPI_INTへの内部的なシリアル化および
非シリアル化処理を用いています.
送信関数(MPI_Send, MPI_Isend, MPI_BCast, など)は
全てのサポートされるデータ型を MPI_INTに変換し,一方,
受信関数(MPI_Recv, MPI_Irecv, など) は元の変数を
回復
します.
5系列におけるメモリ表現と同様に,変数は以下のようにシリアル化されます:
Double, Boolean, 文字列(?)
型 |
行数 |
列数 |
複素数 (関係する場合) |
データ |
整数
型 |
行数 |
列数 |
精度 |
データ |
型 |
行数 |
列数 |
複素数 |
要素数 |
データ |
他の解を検討しましたが,種々の理由により棄却されました:
MPIに基づく新規データ型
は事前に
変数の大きさを知る必要があります.メタデータ(大きさ, 型)が送信されたり, データが送信されたりします.
性能は低下し,コードはかなり複雑化します.
非同期通信
MPI_Irecv とMPI_Isendの標準的な動作はScilab言語で共通する方法とは実際には 異なり、MPI_WairがScilab MPIバインディングに値を返します.
リクエストのリストとMPI_Irecv/MPI_Waitで想定されるMPI変数を保存するために, 最大 10 000 要素を有する静的C構造体が使用されます. これらは,非同期通信で使用される種々のMPIリクエストと MPI_Irecvから期待される変数へのリファレンスを保存する際に使用されます. 受信された値はMPI_Waitにより取得されます.
以下の例では, "42"という名前のリクエストがこのデータ構造体に保存されます.
MPI_Init(); rnk = MPI_Comm_rank(); sizeNodes = MPI_Comm_size(); SLV = rnk; Master = ~ SLV; assert_checkequal(MPI_Comm_size(), 2); if Master for slaveId = 1:sizeNodes-1 value = slaveId*2 MPI_Isend(value, slaveId, 42); end else rankSource = 0; tag = 0; MPI_Irecv(rankSource, tag, 42); // MPI_Irecv は値を返しません value = MPI_Wait(42) // 値は MPI_Waitにより返されます assert_checkequal(value, 2); end MPI_Finalize(); exit()
参照
- MPIの概要 — ScilabからのMPI機能へのアクセス
Report an issue | ||
<< MPI_Send | Scilab MPI | MPI_Wait >> |