gpt4 book ai didi

C - 使用 Scatterv 和动态 2D 数组的段错误

转载 作者:行者123 更新时间:2023-11-30 16:38:47 25 4
gpt4 key购买 nike

我正在尝试使用 2D 数组和 MPI_Scatterv。当我调用 MPI_Scatterv 时,我得到

    ================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 5790 RUNNING AT ubuntu
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

如果我使用 C99 2D 数组,它可以工作,但不能使用 malloc。我想知道我的 malloc 错在哪里。我无法使用线性化二维数组,因此无法创建像 array[i*columns+j] 这样的数组

这是一个测试程序:

int **alloc2d(int n, int m) {
int i;
int **array = malloc(n * sizeof(int*));
array[0] = malloc(n * m * sizeof(int));
for(i = 1; i < n; i++)
array[i] = array[i-1] + m;
return array;
}

int *genSendc(int dim, int numprocs) {
int* sendc = (int*)malloc(sizeof(int)*numprocs);
int i;
int subsize = dim/numprocs;
for(i=0; i<numprocs; ++i)
sendc[i] = subsize;
for(i=0; i<dim-subsize*numprocs; ++i)
sendc[i]+=1;
return sendc;
}

int *genDispl(int numprocs, int*sendc) {
int* displ = (int*)malloc(sizeof(int)*numprocs);
int i;
displ[0]=0;
for(i=1; i<numprocs; ++i)
displ[i] = displ[i-1]+sendc[i-1];
return displ;
}

int main(int argc, char *argv[]){
int numprocs, rank, i, j, N=5, M=4;
int* displMat, *sendcMat;
int **txMatrix, **rxMatrix;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);

sendcMat = genSendc(N, numprocs);
for(i=0; i<numprocs; ++i)
sendcMat[i] *= M;
displMat = genDispl(numprocs, sendcMat);

rxMatrix = alloc2d(sendcMat[rank]/M, M);
if (rank == 0) {
srand(time(NULL));
txMatrix = alloc2d(N, M);
for (i=0; i < N; ++i)
for(j=0; j < M; ++j)
txMatrix [i][j] = (rand() % 10)+1;
}

MPI_Scatterv(&txMatrix[0][0], sendcMat, displMat, MPI_INT, &rxMatrix[0][0], sendcMat[rank], MPI_INT, 0, MPI_COMM_WORLD);

MPI_Finalize();
}

如果我打印rxMatrix之后MPI_Scatterv ,程序打印 Rank0 子矩阵,然后因段错误而崩溃。我哪里错了?

最佳答案

如果 txMatrix 未正确初始化,此表达式将调用未定义的行为。

&txMatrix[0][0]

虽然MPI_Scatterv 的第一个参数对于非根等级*来说无关紧要,但仅评估表达式可能会导致段错误。只需对 root/nonroot 使用 if/else 并为后者传递 NULL 即可。

*:至少按照标准,我发现 MPI 实现中存在此问题。

关于C - 使用 Scatterv 和动态 2D 数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47367485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com