我正在解决一个问题,其中一个进程对一个列进行一些计算,我将该列保存在临时数组中并使用MPI_Bcast将其广播到所有其他进程,但总是在数组中获取所有零在接收端。
以下是我正在使用的代码:
//nProc = no of processors;
//helperA = 2D Array i.e. helperA[size][size]
// colK = 1D Array i.e. colK[size]
for (int k = 0; k < size; ++k) {
if (k % nProc == rank) {
// One of the process will do this calculation
int temp = 0;
for (int j = k + 1; j < size; ++j) {
helperA[j][k] = helperA[j][k]/helperA[k][k];
colK[temp++] = helperA[j][k];
}
}
MPI_Bcast(colK, size - k - 1, MPI_DOUBLE, rank, MPI_COMM_WORLD);
// After this other process should get the colK updated with the calculation
for (int i = k + 1; i < size; ++i) {
if (i % nProc == rank) {
int temp = 0;
for (int j = k + 1; j < size; ++j) {
// Here colK is always zero
printf("%d %f \n", rank, colK[temp]);
helperA[j][i] = helperA[j][i] - (colK[temp++] * helperA[k][i]);
}
}
}
}
我不确定我在这里做错了什么。任何帮助/建议请。
答案 0 :(得分:1)
(我真的不喜欢通过文本框调试代码,因此我假设您已经完成了基本检查,以确保在发送之前colK
中存在实际数据size-k-1
MPI_BCAST
1}}是所有等级的正确值。)
您传入{{1}}调用的等级值应该是“根”进程的等级。也就是说,具有要广播的所有数据的过程。对于所有调用进程,此参数必须相同。您的代码似乎通过了每个调用进程的等级,因此每个人都将尝试与不同的根进程进行通信。