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类型)代码>。好奇为什么?它是关于位移的单位;看见