【问题标题】:MPI Sending Dynamically Sized Array using MPI_AlltoallvMPI 使用 MPI_Alltoallv 发送动态大小的数组
【发布时间】:2013-12-20 10:02:52
【问题描述】:

给定 p 个处理器,每个处理器都有一个唯一的输入大小 i,其中每个输入都是一个唯一的数字。每个处理器都有一个整数范围。

目标:让每个处理器的范围内只有整数

目前在以下情况下遇到问题。 每个处理器都希望导出不在其范围内的值

  1. 每个处理器将不在其输入范围内的值存储在存储桶溢出中
  2. 每个处理器 p,广播溢出的大小,
  3. 获取溢出大小的总和,包括本地溢出大小,并创建一个 total_overflow_size 数组
  4. 现在每个处理器都将使用 MPI_Alltoallv 广播其存储桶
  5. 广播桶现在存储在 globalBucket 数组中

这是我正在使用的MPI_ALLTOALLV 电话:

int *local_overflow = &overflow;
//buckets = local buckets <- contains values not in local range, size of local overflow.
//globalBucket <- size of all overflows from all processors
//offset = Sum of all rank-1 processor's overflow.


MPI_Alltoallv(&buckets,local_overflow,off,MPI_INTEGER,
              &globalBucket,offest,local_overflow,
              MPI_INTEGER,MPI_COMM_WORLD);

我相信我的问题在于适当地偏移值,对应于第 3 和第 7 个参数。

目标是,例如,如果处理器 0 的存储桶大小为 5,处理器 1 的存储桶大小为 12,我希望 proc 0 的存储桶占用数组中的前 5 个空间,而 proc 1 的存储桶占用globalBucket 中接下来的十二个。

我收到诸如

之类的错误消息
*** Process received signal ***
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0xc355bb0
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x1733ae0

MPI_ALLTOALLV 是一个不常见的电话,更多信息请访问:http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Alltoallv.html

编辑:我已经正确计算了我的偏移量 -> 所有先前处理器等级的值,我现在收到与上述相同的错误。

【问题讨论】:

    标签: c++ c mpi dynamic-arrays


    【解决方案1】:

    local_overflow 应该是一个 int 数组,因为你想从这个 rank 向所有其他 rank 发送相同数量的值,local_overflow 的所有元素都应该具有相同的值。

    int *local_overflow = new int[p];
    for (int i = 0; i < p){
        local_overflow[i] = overflow;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 2014-04-18
      • 2014-09-17
      • 2019-08-12
      • 2012-03-19
      • 2012-11-04
      • 2013-03-07
      • 2013-02-11
      • 1970-01-01
      相关资源
      最近更新 更多