尝试将动态数组传递给进程时出现分段错误
Segmentation fault when trying to pass dynamic array to processes
我试图将动态数组从 0 进程传递到 1,反之亦然。在过程 1 中出现分段错误。所有矩阵均按预期打印。在这种情况下可能是什么问题?
int main(int argc, char **argv){
MPI_Init(&argc,&argv);
int n;
cin >> n;
int *matrix = new int[n*n];
int *matrix2 = new int[n*n];
int i,j,ProcNum,ProcRank;
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
MPI_Status status;
if (ProcRank == 0){
/* Filling matrices here with i*n + j values*/
MPI_Send(&n, 1, MPI_INT, 1, 1, MPI_COMM_WORLD);
MPI_Send(&(matrix[0]), n*n, MPI_INT, 1, 2, MPI_COMM_WORLD);
MPI_Recv(&(matrix[0]), n*n, MPI_INT, 1, 2, MPI_COMM_WORLD, &status);
print_matrix(matrix,n);
}
if (ProcRank > 0) {
MPI_Recv(&n, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&(matrix[0]), n*n, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
/*passing i-j values to matrix and printing them here*/
MPI_Send(&(matrix[0]), n*n, MPI_INT, 0, 2, MPI_COMM_WORLD);
}
MPI_Finalize();
delete matrix;
delete matrix2;
return EXIT_SUCCESS;
}
并行程序中的交互式输入总是很危险的。您的 MPI 进程通常是通过 ssh 连接启动的,因此它们可能不会获得终端输入。进程零很可能会,所以我提倡只在进程零上阅读 n
然后广播它。
我试图将动态数组从 0 进程传递到 1,反之亦然。在过程 1 中出现分段错误。所有矩阵均按预期打印。在这种情况下可能是什么问题?
int main(int argc, char **argv){
MPI_Init(&argc,&argv);
int n;
cin >> n;
int *matrix = new int[n*n];
int *matrix2 = new int[n*n];
int i,j,ProcNum,ProcRank;
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
MPI_Status status;
if (ProcRank == 0){
/* Filling matrices here with i*n + j values*/
MPI_Send(&n, 1, MPI_INT, 1, 1, MPI_COMM_WORLD);
MPI_Send(&(matrix[0]), n*n, MPI_INT, 1, 2, MPI_COMM_WORLD);
MPI_Recv(&(matrix[0]), n*n, MPI_INT, 1, 2, MPI_COMM_WORLD, &status);
print_matrix(matrix,n);
}
if (ProcRank > 0) {
MPI_Recv(&n, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&(matrix[0]), n*n, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
/*passing i-j values to matrix and printing them here*/
MPI_Send(&(matrix[0]), n*n, MPI_INT, 0, 2, MPI_COMM_WORLD);
}
MPI_Finalize();
delete matrix;
delete matrix2;
return EXIT_SUCCESS;
}
并行程序中的交互式输入总是很危险的。您的 MPI 进程通常是通过 ssh 连接启动的,因此它们可能不会获得终端输入。进程零很可能会,所以我提倡只在进程零上阅读 n
然后广播它。