3

私の質問はかなり単純です。MPI_Scatter関数の定義は次のとおりです。

#include <mpi.h>
void MPI::Comm::Scatter(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype, void* recvbuf,
int recvcount, const MPI::Datatype& recvtype,
int root) const

'sendcount'と'sendtype'は冗長ですか?その場合、それが発生する可能性があります:sendcount!= recvcount?

編集:たぶん、質問についていくつかの説明が必要です。おそらくその理由は、ルートの場合はデータが「構造体X」であり、レシーバーの場合は「構造体Y」であるため、どういうわけかそれも意味があることを理解しています(すべて「OK」に適合します)。

その場合...受信する予定のデータの合計サイズが送信データのサイズと同じであると再度​​言う必要がある理由がわかりません。データのビューをキャストするだけの場合は、キャストのみを行います。実際、バッファは(void *)です。

4

2 に答える 2

4

MPIでは、同じ基本データ型から構築されている限り、送信側と受信側の両方のデータ型を異ならせることができます。ルートプロセスから他のプロセスの列に行列の行を分散させるなど、これが便利な場合が多くあります。行列のメモリレイアウトは行優先であるため、CおよびC++では行の送受信は簡単です。送信列と受信列では、最初に特別なストライドベクトルタイプを作成する必要があります。1通常、このタイプは指定された数の行と列に対して作成され、データを受信するときにカウントを指定する必要があります。

sendcountとが異なる場合もrecvcountあります。また、受信するメッセージのサイズを指定するのではなくrecvcount 受信バッファの容量を指定し、その容量がメッセージのサイズよりもはるかに大きい場合があることにも注意してください。

于 2012-09-21T13:07:21.170 に答える
0

MPI_scatter()は、メッセージを均等に分割し、子ノードと独自のノードでそれぞれを処理するためのものです。これを知っている:

'sendcount'と'sendtype'は冗長ですか?

-sendCountが送信された要素の数であり、sendTypeがそれらの要素のタイプである場合、これはどのように発生しますか?どちらにも異なる情報が含まれています。

そして最後の質問について:

その場合、それが発生する可能性があります:sendcount!=recvcount?。

-一連の数値を並べ替える場合は、サイズNおよびtype=intのブロックをノードに送信します。あなたは同じがソートされたいです。

于 2012-09-21T11:04:20.783 に答える