Ошибка сегмента возле MPI Bcast при использовании нескольких процессов

Я новичок в 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 ответ

Решение

Итак, ваши массивы сделаны из 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); 
Другие вопросы по тегам