Размер буфера больше, чем count в Mpi_send

0

Это может быть тривиальной вещью, но:

Может ли размер базового массива быть длиннее, чем аргумент count, отправить вместе с указателем буфера в вызове MPI_Send (...)?

Что касается MPI_Recv (...), я нашел источники, в которых четко указано, что это законно (т.е. Буфер больше сообщения).

Кроме того, кажется, что все в порядке, когда я компилирую и запускаю приведенную ниже программу

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char **argv){
  int i;

  MPI_Init(&argc, &argv);

  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  int world_size;
  MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  if( world_size != 2 ) {
    printf("You're supposed to use exactly 2 processes, dude!\n");
    MPI_Abort( MPI_COMM_WORLD, 0 );
  }

  int *ids = (int*)( malloc( 10*sizeof(int) ) );

  if( world_rank == 0 ) {
    for( i=0; i<10; i++)
      ids[i]=i+1;
    MPI_Send( ids, 5, MPI_INT, 1, 0, MPI_COMM_WORLD);
  }else{
    for( i=0; i<10; i++)
      ids[i]=20-i;
    MPI_Recv( ids, 5, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  }
  for( i=0; i<10; i++)
    printf("me %d   %d %d\n",world_rank,i,ids[i]);

  free(ids);

  MPI_Finalize();

  return 0;
}

потому что я получаю следующий вывод без сообщений об ошибках:

me 0   0 1
me 0   1 2
me 0   2 3
me 0   3 4
me 0   4 5
me 0   5 6
me 0   6 7
me 0   7 8
me 0   8 9
me 0   9 10
me 1   0 1
me 1   1 2
me 1   2 3
me 1   3 4
me 1   4 5
me 1   5 15
me 1   6 14
me 1   7 13
me 1   8 12
me 1   9 11

Но я хотел бы получить уверенность, потому что я все еще новичок...

  • 0
    Это не только безопасно: это то, что обычно делают постоянно. Например, когда вам нужно отправить / получить данные-призраки на границе массива. Или вы отправляете строку 2D-массива. Кроме того, MPI поддерживает отправку / получение разреженных буферов с типами данных MPI - например, отправка столбца двумерного массива. Так что не волнуйтесь - ваш код в порядке.
Теги:
mpi

1 ответ

2

Поскольку вы передаете буфер в MPI_Send и сообщаете ему, насколько велик буфер, буфер - это любой размер, который вы говорите. Если вы хотите вырезать большой буфер в более мелкие буферы, это ваш бизнес. MPI_Send не имеет способа сказать, как вам удалось выделить или создать буфер, который вы ему передаете, и ему все равно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню