MPI を使用して並列化しようとしているプログラムがあります。このプログラムでは、各プロセスにベクターの複製があります。個々のプロセスはベクター内の任意のアイテムを編集できますが、設計上、複数のプロセスで編集されるアイテムはありません。次に、プロセス全体でベクトルを更新する方法が必要です。これにより、各プロセスには、各プロセスから更新された値がベクトルに含まれる重複がもう一度含まれるようになります。
変更されたかどうかを示す追加の bool ベクトルを使用する、収集してから比較してからブロードキャストするなど、これを行ういくつかの潜在的な方法を考えることができますが、私のお気に入りは、カスタム MPI_Op で allreduce 呼び出しを使用して値を比較し、一意のものに変更することです。価値。残念ながら、MPI_op は、2 つのベクトルのみが渡されるように定義されているようで、一意の値を見つけることができません。
この種の問題は特に珍しいことではないと思うので、私が見逃したかもしれない別のアプローチを遠慮なく指摘してください。ありがとう。
これは私が試みていたものですが、正しい値ではなく一意の値を誤って更新する可能性があるため、失敗することがわかります。
void assignDifferent(double *in, double * inout, int *len, MPI_Datatype *dptr){
int i;
double newValue;
for (i = 0; i<*len ; i++){
*inout = in[i]==*inout? *in:*inout;
in++,inout++;
}
}