Я заметил странную вещь с размером буфера MPI_Send и MPI_Recv, который я не могу понять. Документация говорит, что count
аргумент этих функций описывает ряд элементов из datatype
типа:MPI_Send/MPI_Recv: количество элементов или размер буфера?
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm);
Количество [в] число элементов в буфере передачи (неотрицательное целое число)
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status);
кол-во [в] максимальное количество элементов в буфере приема (целое число)
Предположим, что мы имеем 2 процесса, первый процесс (корень) выделяет массив п целых чисел и заполняет его с некоторыми данными
int* temp = (int*) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) temp[i] = ...;
затем посылает его ко второму процессу с рангом = 1.
MPI_Send(temp, n, MPI_INT, 1, 0, MPI_COMM_WORLD);
Второй процесс получает этот массив п целых чисел.
MPI_Recv(temp, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_INGNORE);
Но после того, как MPI_Recv temp
массив появился усеченный. Когда я изменил аргумент count
от n
до n * sizeof(int)
, я получил правильный массив. Но n * sizeof(int)
описывает размер буфера в байтах, а не в элементах, как указано в документации. Это обычное поведение или простое недоразумение? Постскриптум Я использую MPICH2 x86 как реализация MPI и 32-битном VS08 на ОС Windows 7.
Вы читаете документацию правильно, и нет никаких проблем с линиями отправки и возврата, как было опубликовано, что предлагает проблемы в другом месте.Правильно ли заданы temp и n для обеих задач? –
Спасибо за комментарий. Да, n значений равны для обеих задач, а temp-массив правильно определен. – Symbolist
Ну, вам нужно будет предоставить больше кода, потому что проблема не очевидна из того, что вы предоставили. Как всегда, лучший, самодостаточный, воспроизводимый пример лучше. –