私はMPI_Ibcastの仕組みを理解しようとしています。 私は何が必要なのかを示す1つのテストを考え出しました。私はIbcastの右の使い方を理解しないかもしれないように、それは、正しくない可能性があり :MPI_Ibcastは、最初の反復で関数内で呼び出すことができる場合MPI-Ibcastの使用
#include <iostream>
#include <mpi.h>
#include <string>
#include <vector>
using namespace std;
class A {
public:
int a[3];
MPI_Request request;
int tag;
A() {}
int foo() {
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
cout<<rank<<endl;
if (rank == 0)
tag = 5;
MPI_Ibcast(&tag, 1, MPI_INT, 0, MPI_COMM_WORLD, &request);
}
};
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Status* status = new MPI_Status[2];
MPI_Request* request = new MPI_Request[2];
A* a = new A[2];
for (int i = 0; i < 2; i++) {
a[i].request = request[i];
}
for (int i = 0; i < 2; i++) {
if (i == 0 && rank == 0) {
a[0].foo();
}else if (i == 1 && rank == 1) {
a[1].foo();
}
int a;
for (int i = 0; i < 1000; i++)
a+=i;
}
MPI_Waitall(2, request, status);
cout <<a[1].tag<<" "<<a[1].tag<<" "<<a[1].tag<<endl;
MPI_Finalize();
}
私は、見たいと思って、この関数は返し、別にMPI_Ibcastを呼び出して、すべて終了します(タグはブロードキャストされ、2つのプロセスすべてで5に設定されます)。私がここでクラスを使う理由は、それらを元のプログラムの中に入れて、小さな問題をモデル化しようとしているからです。
タスクは次のとおりです。別々のサイクルでは、別々のプロセス上の別個のインスタンスが関数を呼び出します。それらのいくつかはグループで編成され、このグループの中でIbcastはタグをブロードキャストします。ここで私は2つのクラスを持つ1つのグループを持っています。たぶん私はこの例をどうにかして修正すべきでしょうか?