MPI使用MPI_Alltoallv发送动态大小的数组

时间:2013-12-04 03:58:13

标签: c++ c mpi dynamic-arrays

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

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

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

  1. 每个处理器从桶溢出输入
  2. 中获取不在其范围内的值
  3. 每个处理器p,广播溢出的大小,
  4. 获取溢出大小的总和,包括本地溢出大小,并创建一个total_overflow_size数组
  5. 每个处理器现在将使用MPI_Alltoallv
  6. 广播其存储桶
  7. 广播的存储桶现在存储在globalBucket数组
  8. 这是我正在使用的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的桶占据阵列中的第1个空格,并且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

    编辑:我已正确计算了偏移量 - &gt;所有以前处理器排名的值,我现在收到与上面相同的错误。

1 个答案:

答案 0 :(得分:1)

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

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