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

Я пытаюсь прочитать из файла для приложения MPI. Кластер имеет 4 узла с 12 ядрами в каждом узле. Я попытался запустить основную программу для вычисления ранга, и это работает. Когда я добавил MPI_File_open, он генерирует исключение во время выполнения

ПЛОХОЕ ПРЕКРАЩЕНИЕ ОДНОГО ИЗ ВАШИХ ПРОЦЕССОВ ЗАЯВКИ = ВЫХОДНОЙ КОД: 139

В кластере установлен MPICH2 и сетевая файловая система. Я проверяю MPI_File_open с различными параметрами, такими как режим ReadOnly, MPI_COMM_WORLD и т. Д.

Могу ли я использовать MPI_File_open с сетевой файловой системой?

int main(int argc, char* argv[])
{
    int myrank          = 0;
    int nprocs          = 0;
    int i               = 0;
    MPI_Comm    icomm   = MPI_COMM_WORLD;
    MPI_Status  status;

    MPI_Info    info;
    MPI_File    *fh     = NULL;

    int         error       = 0;

    MPI_Init(&argc, &argv);
    MPI_Barrier(MPI_COMM_WORLD);        // Wait for all processor to start

    MPI_Comm_size(MPI_COMM_WORLD, &nprocs); // Get number of processes
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); // Get own rank

    usleep(myrank*100000);
    if ( myrank == 1 || myrank == 0 )
        printf("Hello from %d\r\n", myrank);

    if (myrank == 0)
    {
        error = MPI_File_open( MPI_COMM_SELF, "lw1.wei", MPI_MODE_UNIQUE_OPEN,
                               MPI_INFO_NULL, fh);
        if ( error )
        {
            printf("Error in opening file\r\n");
        }
        else
        {
            printf("File successfully opened\r\n");
        }
        MPI_File_close(fh);
    }

    MPI_Barrier(MPI_COMM_WORLD);        //! Wait for all the processors to end
    MPI_Finalize();

    if ( myrank == 0 )
    {
        printf("Number of Processes %d\n\r", nprocs);
    }

    return 0;
}

1 ответ

Решение

Вы забыли выделить MPI_File Объект до открытия файла. Вы можете изменить эту строку:

MPI_File    *fh     = NULL;

в:

MPI_File     fh;

и откройте файл, дав fhадрес к MPI_File_open(..., &fh), Или вы можете просто выделить память из кучи, используя malloc(),

MPI_File    *fh      = malloc(sizeof(MPI_File));
Другие вопросы по тегам