Пытаюсь отправить массив по кругу через несколько рангов в MPI, но получаю ошибки сегмента.Может кто-нибудь сказать, пожалуйста, почему? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь отправить массив из одного процесса (ранга) в другой по «кругу», используя MPI в C. Я могу заставить его работать нормально, используя одиночные целые числа, но получаю ошибки сегментации, когда пытаюсь отправить массив через.

{
int rank;
int numRanks;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numRanks);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

int arraysize = 100;

int *array;

if (rank == 0) {
    array = malloc(sizeof(int)*arrasize);
    for (int i = 0; i < arraysize; i++) {
        array[i] = 1;
    }
    double starttime = MPI_Wtime();
    MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
    MPI_Recv(&array, arraysize, MPI_INT, numRanks-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    double endtime = MPI_Wtime();
    printf("Rank %d got array from Rank %d in %lf", rank, numRanks-1, endtime-starttime);
} else if (rank == (numRanks-1)) {
    MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Rank %d got array from Rank %d", rank, rank-1);
    MPI_Send(&array, arraysize, MPI_INT, 0, 0, MPI_COMM_WORLD);
} else {
    MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Rank %d got array from Rank %d", rank, rank-1);
    MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
}

free(array);

MPI_Finalize();
return 0;

}

Вот сообщение об ошибке (сейчас я использую только три ранга для простоты):

Rank 1 got array from Rank 0
[winston:42137] *** Process received signal ***
[winston:42137] Signal: Segmentation fault (11)
[winston:42137] Signal code: Address not mapped (1)
[winston:42137] Failing at address: 0x7add28

, а затем больше одинаковых для каждого ранга, пытающегося отправить и получить массив

любая помощь, которую кто-либо может оказать, будет принята с благодарностью !!

1 Ответ

1 голос
/ 31 мая 2019

Ваш array не указывает на действительный адрес памяти в каждом процессе (ранге), кроме 0-го.Это приведет к сбою вашей программы при попытке записать что-либо по случайному (то есть недействительному) адресу, то есть когда вы звоните MPI_Recv(&array, arraysize....

(спасибо Gilles Gouaillardet, указанным в комментарии).array (не &array) для функций MPI, потому что сам по себе является указателем на адрес, который выделен вам для хранения некоторых int.

Итак, решение будет:

  1. Запустите array = malloc(sizeof(int)*arrasize); для каждого процесса.
  2. Измените MPI_Recv(&arrayMPI_Send(&array) на MPI_Recv(arrayMPI_Send(array.
...