arrays - 二维数组的 MPI 数据类型

标签 arrays 2d mpi types

我需要将一个整数数组数组(基本上是一个二维数组)从 root 传递给所有处理器。我在 C 程序中使用 MPI。如何为二维数组声明 MPI 数据类型以及如何发送消息(我应该使用广播还是分散)

最佳答案

您需要使用 Broadcast ,因为您想向每个进程发送相同消息的副本。 Scatter分解消息并在进程之间分配块。

至于如何发送数据:HIndexed数据类型是给你的。

假设你的二维数组是这样定义的:

int N;            // number of arrays (first dimension)
int sizes[N];     // number of elements in each array (second dimensions)
int* arrays[N];   // pointers to the start of each array

首先,您必须计算每个数组的起始地址相对于数据类型的起始地址的位移,它可以是第一个数组的起始地址,以方便处理:
MPI_Aint base;
MPI_Address(arrays[0], &base);
MPI_Aint* displacements = new int[N];
for (int i=0; i<N; ++i)
{
    MPI_Address(arrays[i], &displacements[i]);
    displacements[i] -= base;
}

那么您的类型的定义将是:
MPI_Datatype newType;
MPI_Type_hindexed(N, sizes, displacements, MPI_INTEGER, &newType);
MPI_Type_commit(&newType);

此定义将创建一个数据类型,其中包含一个接一个打包的所有数组。完成此操作后,您只需将数据作为此类型的单个对象发送:
MPI_Bcast(arrays, 1, newType, root, comm);   // 'root' and 'comm' is whatever you need

但是,您还没有完成。接收进程将需要知道您要发送的数组的大小:如果在编译时该知识不可用,则您必须首先发送带有该数据的单独消息(简单的整数数组)。如 N , sizesarrays在接收进程上定义与上面类似,分配足够的空间来填充数组,然后所有接收进程需要做的就是定义相同的数据类型(与发送方的代码完全相同),然后将发送方的消息作为单个接收该类型的实例:
MPI_Bcast(arrays, 1, newType, root, comm);    // 'root' and 'comm' must have the same value as in the sender's code

瞧!所有进程现在都有一个您的阵列的副本。

当然,如果二维数组的第二维固定为某个值 M,事情会变得容易得多。 .在这种情况下,最简单的解决方案是将其存储在单个 int[N*M] 中。数组:C++ 将保证它都是连续的内存,因此您可以在不定义自定义数据类型的情况下广播它,如下所示:
MPI_Bcast(arrays, N*M, MPI_INTEGER, root, comm);

注意:您可能会逃避使用 Indexed类型而不是 HIndexed。不同的是,在 Indexed 中,displacements数组以元素数给出,而在 HIndexed 中它是字节数(H 代表异构)。如果您要使用索引,则在 displacements 中给出的值必须除以 sizeof(int) .但是,我不确定在堆上的任意位置定义的整数数组是否能保证在 C++ 中“对齐”到整数限制,并且在任何情况下,HIndexed 版本的代码(略微)更少并产生相同的结果。

关于arrays - 二维数组的 MPI 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2651547/

相关文章:

objective-c - 如何将 NSArray 写入 NSOutputStream?

c - 从最大大小为 100 的数组中获取用户输入后,如何检查用户输入了多少个值?

algorithm - 测试点是否在角度内

python - 在 Python-mpi4py 中使用 2D 列表时 MPI 分散方法中的 ValueError

c++ - MPI_Scatter 会减慢代码速度吗?

arrays - 在字典中创建键/值对时,Swift 强制将 Bool 强制转换为 Int 错误

php - 避免在 PHP 中显示来自数据库的重复结果

java - 在java中创建一个带有2个键(索引和键)的映射

algorithm - 精确高效绘图的技术和算法

c - MPI 状态获取错误的发件人