【问题标题】:Buffer size larger than count in Mpi_send缓冲区大小大于 Mpi_send 中的计数
【发布时间】:2014-02-24 22:56:45
【问题描述】:

这可能是一件微不足道的事情,但是:

底层数组的大小可能比在 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

但我想放心,因为我还是个新手……

【问题讨论】:

  • 这不仅是安全的:它是经常做的事情。例如,当您必须在数组的边界上发送/接收幽灵数据时。或者您发送一行二维数组。此外,MPI 支持使用 MPI 数据类型发送/接收稀疏缓冲区 - 例如,发送 2D 数组的列。所以不用担心 - 你的代码没问题。

标签: c++ mpi


【解决方案1】:

既然您将缓冲区传递给MPI_Send 并告诉它缓冲区有多大,那么缓冲区就是您所说的大小。如果您想将一个大缓冲区切割成较小的缓冲区,那是您的事。 MPI_Send 无法告诉您如何设法分配或创建您传递给它的缓冲区,它并不关心。

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多