c++ - 如何使用 MPI 发送 3D 数组的切片?
问题描述
我Foo3D
在等级 0 和 1 中有一个 3D 数组(50 x 100 x 100)。Foo3D
分配如下:
int nx = 50;
int ny = 100;
int nz = 100;
typedef int nRarray[100][50];
nRarray *Foo3D;
if ((Foo3D = (nRarray *)malloc((nx*ny*nz)*sizeof(int))) == 0) {fprintf(stderr,"malloc1 Fail \n"); return 1;}
我将一些数字分配给Foo3D
0 级并将其保存到一个新的二维数组 ( Foo2D
) 中:
if (myrank == 0) {
for (int j = 0; j < ny; j++) {
for (int k = 0; k < nz; k++) {
Foo3D[0][j][k] = j + k;
Foo2D[j][k] = Foo3D[0][j][k];
}
}
}
现在,我有兴趣发送Foo2D
到排名 1,并将其放在Foo3D
. 事实上,我知道我可以发送Foo2D
到排名 1:
if (myrank == 0)
{
MPI_Send(Foo2D,sizeof_Foo2D,MPI_INT,1,100,MPI_COMM_WORLD);
}
else if (myrank == 1)
{
MPI_Recv(Foo2D,sizeof_Foo2D,MPI_INT,0,100,MPI_COMM_WORLD, &status);
}
然后将接收到Foo2D
的 rank 1 分配到它的位置Foo3D
:
if (myrank == 1)
{
for (int j = 0; j < ny; j++) {
for (int k = 0; k < nz; k++) {
Foo3D[0][j][k] = Foo2D[j][k];
}
}
}
不使用此过程并将Foo2D
其作为中间变量,是否可以将Foo3D
rank 0 中的切片直接发送到其在 rank 1 中的等效位置?事实上,我不想将整体发送Foo3D
到排名 1,因为它是一个非常大的数组,我有兴趣将其中的一部分发送到排名 1。
解决方案
您将数组定义Foo3D
为int[nx][ny][nz]
. 因为 C/C++ 是行主要语言,所以表示为的网格面的元素实际上在内存Foo3D[0][j][k]
中是连续的。
因此,您可以简单地将面部发送到i=0
使用:
if (myrank == 0) {
MPI_Send(Foo3D, ny*nz, MPI_INT, 1, 100, MPI_COMM_WORLD);
}
else if (myrank == 1){
MPI_Recv(Foo3D, ny*nz, MPI_INT, 0, 100, MPI_COMM_WORLD, &status);
}
另一方面,如果您想在不使用缓冲区(零复制)的情况下发送非连续数据,您可以创建一个自定义 MPI 数据类型来表示您要复制的数据,并直接从源缓冲区发送,然后 MPI将读取您指定的数据,即使它在内存中不连续。这可以使用.MPI_Type_vector
例如,如果要发送值 where k=0
,即网格面
Foo[i][j][0]
。
首先,创建一个表示要发送的网格面的数据类型。
// Create a data type and save its size
MPI_Datatype cubeface;
int cubefacesize;
MPI_Type_vector(nx*ny, 1, nz, MPI_INT, &cubeface);
MPI_Type_commit(&cubeface);
MPI_Type_size(cubeface, &cubefacesize);
然后,您可以使用以下方式发送和接收:
if (myrank == 0) {
MPI_Send(Foo3D, 1, cubeface, 1, cubefacesize, MPI_COMM_WORLD);
} else if (myrank == 1) {
MPI_Recv(Foo3D, 1, cubeface, 0, cubefacesize, MPI_COMM_WORLD, &status);
}
推荐阅读
- node.js - 如何开发新的 IoTAgent
- while-loop - 如何在 R 中使用 while 循环生成具有特定数字的矩阵?(for->while)
- python - 多处理 - 内存消耗
- python - Windows 10 找到 pip 但没有找到 python
- java - 需要一个找不到的“com.ganesh.utils.JwtUtils2”类型的 bean
- reactjs - React 父布局取决于子级(必须重新渲染)
- mysql - 使用 Web 服务和 myPHPAdmin 将迁移的 .net 站点连接到 Synology NAS 上的 MySQL 数据库的问题
- c++ - 未定义的符号 str::string 和字符串文字
- javascript - GEOJSON 为什么给出 3 个坐标系,谁能更简单地解释一下它的属性
- python - 导入 keras 和 tensorflow 时出错