我认为这是一个非常奇怪的问题:我有这个代码:它应该接收一个大小为块和宽度的二维矩阵。矩阵分配使用:
int **alloc2d(int n, int m) {
int i = 0;
int *data = malloc(n * m * sizeof(int));
int **array = malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
array[i] = &(data[i * m]);
}
return array;
}
所以它是一个连续的内存块。
我有以下代码:
MPI_Status st;
int worker;
for(i = 1; i < size; i++) {
MPI_Recv(&(recmat[0][0]), chunk*width, MPI_INT, MPI_ANY_SOURCE, 1,
MPI_COMM_WORLD, &st);
worker = st.MPI_SOURCE;
/* for(k = worker * chunk; k < (worker + 1) * chunk; k++){
for(j = 0; j < width; j++) {
mat[k][j] = recmat[k - worker * chunk][j];
}
}*/
}
如果代码是这样的,一切都会停止并且运行良好。如果我取消注释该区域:
for(k = worker * chunk; k < (worker + 1) * chunk; k++){
for(j = 0; j < width; j++) {
mat[k][j] = recmat[k - worker * chunk][j];
}
}
运行此代码的线程不会停止,我找不到对此的合理解释。也许有人可以看到错误或问题。谢谢!
recmat 分配和块计算:
int **recmat;
recmat = alloc2d(chunk,width);
int chunk;
chunk = height / size;