如何在mpi中传输数据
How transfer data in mpi?
正如我所知,在mpi中,我们可以在计算机之间传输一些数组。我们可以转移其他东西而不是数组吗?例如,是否可以直接传输"集合"数据?
是的,您可以使用MPI传输任意复杂类型的数据。所有通信操作都采用数据类型参数。这可能是与C/C++中的内置类型(例如MPI_INT
/int
或MPI_DOUBLE
/double
)或更复杂的用户定义类型相对应的基本预定义数据类型。
我最近刚刚发布了一个完整的工作(纯C)示例,其中integer
值后面跟着一个double
s数组,在MPI_Type_create_struct
的帮助下传输,它可以用来定义这样一个用户定义的数据类型:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
MPI_Init(&argc, &argv);
int i, rank, tag = 1;
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// Array of doubles plus element count
typedef struct {
int row;
double elements[4];
} My_array;
// Derived datatype for an array of doubles plus element count
MPI_Datatype MY_ARRAY_TYPE;
const int nr_blocks = 2;
int blocklengths[2] = {1, 4};
MPI_Datatype oldtypes[2] = {MPI_INT, MPI_DOUBLE};
MPI_Aint displacements[2];
displacements[0] = offsetof(My_array, row);
displacements[1] = offsetof(My_array, elements);
MPI_Type_create_struct(nr_blocks, blocklengths, displacements,
oldtypes, &MY_ARRAY_TYPE);
MPI_Type_commit(&MY_ARRAY_TYPE);
if(rank == 0) {
My_array array1 = {3, 3.1, 3.2, 3.3, 3.4};
MPI_Send(&array1, 1, MY_ARRAY_TYPE, 1, tag, MPI_COMM_WORLD);
}
if(rank == 1) {
My_array array2;
MPI_Recv(&array2, 1, MY_ARRAY_TYPE, 0, tag, MPI_COMM_WORLD, &status);
printf("Rank %d received elements of row %d:n", rank, array2.row);
for(i = 0; i < 4; i++)
printf("t%.1fn", array2.elements[i]);
}
MPI_Type_free(&MY_ARRAY_TYPE);
MPI_Finalize();
}
还有其他不太通用的派生数据类型构造函数更易于使用;你可以在这个答案中看到两个例子。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- 从C++调用 Python 脚本以持续流式传输数据
- 无法从 C++ 中的类正确传输数据
- 如何使用C++通过xbee传输数据?
- 如何通过 UDP 传输数据 (XML)?
- QTcpSocket ready读取信号在传输数据时停止发出
- 如何在"mwArray *"和"mxArray *"之间传输数据?
- 从GPS向SIGFOX传输数据
- 如何在C 中连接两个对象以在它们之间传输数据
- 使用 Win32/WINAPI 通过内存映射文件传输数据
- 蓝牙可以接收数据,但不能传输数据(用C++进行套接字编程以与Matlab通信)
- 实时在语言之间流水线传输或以其他方式传输数据
- 在网络上传输数据
- 如何在TCP端口上实时传输数据期间减少CPU使用率
- 使用Emscripten Worker API传输数据而不进行复制
- 在单声道项目和 C++ 控制台应用之间传输数据
- 是指向在向函数返回值/参数和类请求传输数据期间复制的内存的指针
- 在列表小部件之间传输数据
- r语言 - 如何直接在数据库服务器上运行C++进程以避免传输数据集