2013-04-18 3 views
0

Я заметил странную вещь с размером буфера 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.

+1

Вы читаете документацию правильно, и нет никаких проблем с линиями отправки и возврата, как было опубликовано, что предлагает проблемы в другом месте.Правильно ли заданы temp и n для обеих задач? –

+0

Спасибо за комментарий. Да, n значений равны для обеих задач, а temp-массив правильно определен. – Symbolist

+1

Ну, вам нужно будет предоставить больше кода, потому что проблема не очевидна из того, что вы предоставили. Как всегда, лучший, самодостаточный, воспроизводимый пример лучше. –

ответ

0

Установив счетчик на n * sizeof(int), вы увеличиваете количество разрешенных въездов в буфере n * sizeof(int)

В зависимости от размера вашего буфера , это будет

count * sizeof(int) = n * sizeof(int) * sizeof(int).

Помнить, что счетчик представляет количество записей.

Программа работает должным образом, потому что размер отправленного массива меньше размера буфера.

2

Согласно
https://www.open-mpi.org/doc/v1.8/man3/MPI_Recv.3.php,
количество аргументов содержит количество элементов в буфере.

Количество
Максимальное количество элементов, чтобы получить (целое число).

Число байтов должно быть рассчитано путем умножения количества элементов (количества) и размера каждого элемента (заданного константой типа MPI_Datatype).

Смежные вопросы