使用多个进程时,在MPI Bcast附近发生故障

时间:2017-09-23 02:38:46

标签: c mpi

我是MPI的新手,我目前正在开展一个项目,要求我在我的本地beowulf集群上进行数组分析。我的代码是用C语言编写的,它可以正确编译。它仅在使用单个进程时才能正常运行,但是当我尝试使用多个进程运行它时,除了根(等级0)之外的每个进程在我尝试广播我的数据时都会在该点附近死亡。我的代码看起来像这样

//1. Initialize global variables
//2. Initialize MPI, get  number of processes, get rank 
//3. All processes create two dimensional arrays 
    array1 = (char **) malloc(sizeArray1 * sizeof(char *));
    array1[0] = (char *) malloc(sizeArray1 * lineLength * sizeof(char)); 
    for(i = 1; i < sizeArray1; i++)
    {
            array1[i] = array1[i - 1] + lineLength;
    }
    //4. Only server will populate it's arrays, then broadcast to all processes
    if(rank == 0)
    {
            f = fopen("path..../testFile1.txt", "r");
            if(NULL == f) {
                    perror("FAILED: ");
                    return -1;
            }
            numWords = 0;
            while(err != EOF && numWords < sizeArray2)
            {
                    err = fscanf(f, "%[^\n]\n", array2[numWords]);
                    numWords ++;
            }
            fclose(f);

    }

//5. Broadcast each line from both arrays to all processes 
MPI_Bcast(array1, sizeArrray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);
 //6. do further work on arrays 

根节点将完美地完成所有这些,而其他节点通常会尝试广播一次,打印一行,然后死掉。我得到的确切错误是

Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x37
malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

如果您需要查看我的代码中的任何其他部分,请告诉我

注意:我编辑了我的代码以符合其他用户的建议,但错误仍然存​​在

1 个答案:

答案 0 :(得分:0)

因此,您的数组由char而非int组成。 所以你应该MPI_Bcast() MPI_CHAR而不是MPI_INT。 例如

MPI_Bcast(&(array1[i][0]), lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);

作为一种风格问题,您也可以将其写为

MPI_Bcast(array1[i], lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);

此外,您可能希望在一个块中分配array1,因此您可以通过一次调用MPI_Bcast()(这通常更有效)

分配看起来像

array1 = (char **)malloc(sizeArray1 * sizeof(char *);
array1[0] = (char *)malloc(sizeArray1 * lineLength * sizeof(char));
for (int i=1; i<sizeArray1; i++) array1[i] = array1[i-1] + lineLength;

然后

MPI_Bcast(array1, sizeArray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);