如何在此功能中没有通信过程?

How to do without communication processes in this function?

本文关键字:通信 过程 功能      更新时间:2023-10-16

我有一个函数main,我只想在其中执行1次(即仅在0个进程中执行(的代码,除了调用multiStrassen函数的一行 - 我想通过所有进程(0-7个进程(执行这一行。是否可以不使用MPI_Send和MPI_Recv来通信进程?我可以做一些更容易的事情吗?因为那时我需要将大量复杂数据从 0 进程传输到所有其他进程(我在 multiStrassen 函数中这样做,并且不想在这里做,因为我的代码最终变得不可读(。一行破坏了一切...

int main(int argc, char** argv) {
int WORLD_RANK, WORLD_SIZE;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &WORLD_RANK);
MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
...    
int dimensionNew = ...
vector<vector<int>> matrixA = ...
vector<vector<int>> matrixB = ...
vector<vector<int>> matrixC1(dimensionNew, vector<int>(dimensionNew));
clock_t start2, end2;
start2 = clock();
matrixC1 = multiStrassen(matrixA, matrixB, dimensionNew); //this line
end2 = clock();
double answer2 = ((double) end2 - start2) / (CLOCKS_PER_SEC);
cout << "Strassen = " << answer2 << " sec." << endl;
MPI_Finalize();
return 0;
}

您可以简单地使用MPI_Comm_rank来获得进程 ID:

int rank;
MPI_Comm_rank (MPI_COMM_WORLD, &rank); 

然后,通过检查此值,可以决定调用或不调用代码的哪些部分:

if (rank == 0)
{
// this code only is called by the rank-0 process
}
// this code is called by all of the processes

此外,考虑到multiStrassen(...)将在所有进程上执行的事实,您需要提供其输入(例如matrixAmatrixBdimensionNew(通过发送它们(从一个进程到每个进程(或通过在每个进程中计算它们。