C MPI-V位移未按预期工作

C MPI-V位移未按预期工作,c,mpi,openmpi,mpich,C,Mpi,Openmpi,Mpich,我有以下代码可以编译和运行: mpicc -std=c99 region.c mpirun -n 4 region $mpirun-版本 mpirun(开放MPI)1.6.5 $mpicc—版本 gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2 实际返回: 0 1 2 3 0 0 0 0 8 9 10 11 0 0 0 0 16 17 18 19 0 0 0 0 24 25 26 2

我有以下代码可以编译和运行:

mpicc -std=c99 region.c
mpirun -n 4 region
$mpirun-版本

mpirun(开放MPI)1.6.5

$mpicc—版本

gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2

实际返回:

0   1   2   3   0   0   0   0   
8   9   10  11  0   0   0   0   
16  17  18  19  0   0   0   0   
24  25  26  27  0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0
0   1   2   3   0   0   0   0   
8   9   10  11  0   0   0   0   
16  17  18  19  0   0   0   0   
24  25  26  27  4   5   6   7   
0   0   0   0   12  13  14  15  
0   0   0   0   20  21  22  23  
0   0   0   0   28  29  30  31  
0   0   0   0   0   0   0   0
如果我将位移更改为0,1,32 36,则得到以下结果:

local_image_size[0] = 4
local_image_size[1] = 4
image_size[1] = 8
extent(MPI_UNSIGNED_CHAR) = 1 byte
分布向量:

0   1   2   3   4   5   6   7   
8   9   10  11  12  13  14  15  
16  17  18  19  20  21  22  23  
24  25  26  27  28  29  30  31  
32  33  34  35  36  37  38  39  
40  41  42  43  44  45  46  47  
48  49  50  51  52  53  54  55  
56  57  58  59  60  61  62  63  
0   1   2   3   4   5   6   7   
8   9   10  11  12  13  14  15  
16  17  18  19  20  21  22  23  
24  25  26  27  28  29  30  31  
32  33  34  35  36  37  38  39  
40  41  42  43  44  45  46  47  
48  49  50  51  52  53  54  55  
56  57  58  59  60  61  62  63  
实际返回:

0   1   2   3   0   0   0   0   
8   9   10  11  0   0   0   0   
16  17  18  19  0   0   0   0   
24  25  26  27  0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0   
0   0   0   0   0   0   0   0
0   1   2   3   0   0   0   0   
8   9   10  11  0   0   0   0   
16  17  18  19  0   0   0   0   
24  25  26  27  4   5   6   7   
0   0   0   0   12  13  14  15  
0   0   0   0   20  21  22  23  
0   0   0   0   28  29  30  31  
0   0   0   0   0   0   0   0

为什么1的位移在返回向量中转换为28?这让我很困惑。
MPI\u GATHERV
中的位移是以数据类型的范围为单位指定的。由
MPI\u Type\u向量创建的数据类型(local\u image\u size[0]、local\u image\u size[1]、image\u size[1]、MPI\u UNSIGNED\u CHAR和recv\u Type)的范围为
{(本地图像大小[0]-1)*图像大小[1]+本地图像大小[1]}*范围(MPI\U未签名字符)
。鉴于以下情况:

local_image_size[0] = 4
local_image_size[1] = 4
image_size[1] = 8
extent(MPI_UNSIGNED_CHAR) = 1 byte
这导致
recv_type
的范围为
(4-1)*8+4
或28字节。因此,位移为1指定超过接收缓冲区开头28字节的位置


可以通过使用
MPI\u type\u create\u resized
在类型上强制一个不同的“可见”范围来“调整”类型的大小。正确执行2D分解的整个过程在中有很好的描述。

如果使用valgrind(mpirun-np 4 valgrind a.out)运行此过程,您将看到您正在覆盖内存-但是如果您将create_types()中的最后两行更改为
MPI_数据类型tmptype;MPI_类型_向量(本地图像大小[0]、本地图像大小[1]、图像大小[1]、MPI_无符号字符和tmptype);MPI类型\u创建大小调整(tmptype、0、sizeof(无符号字符)和recv类型);MPI类型提交(&recv类型)。好奇为什么?它是关于位移的单位;看见