1
我嘗試瞭解MPI_Ibcast是如何工作的。 我想出了一個測試,說明我需要什麼。 它可能不是正確的,因爲我可能不理解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可以在函數中的第一次迭代被調用,那麼這個函數返回,而在另一個迭代另一個進程也會調用MPI_Ibcast,然後全部結束(標籤將在所有兩個進程中廣播並設置爲5)。我在這裏使用類的原因是,我將它們放在原始程序中,在這裏我嘗試模擬一個小問題。
所以,任務是:在分開的循環中,單獨進程中的單獨實例調用一個函數。其中一些組織成組,組內Ibcast廣播標籤。在這裏,我有一個組和兩個班。也許我應該改正這個例子?