给定 p 处理器,每个处理器具有唯一的输入大小 i ,其中每个输入都是唯一的数字。每个处理器都有一个整数范围。
目标:让每个处理器只有其范围内的整数
目前在以下情况下遇到问题。 每个处理器都希望导出不在其范围内的值
这是我正在使用的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;所有以前处理器排名的值,我现在收到与上面相同的错误。
答案 0 :(得分:1)
local_overflow
应该是一个int数组,因为你想从这个等级向所有其他等级发送相同数量的值,local_overflow的所有元素应该具有相同的值。
int *local_overflow = new int[p];
for (int i = 0; i < p){
local_overflow[i] = overflow;
}