【发布时间】:2017-05-30 01:01:16
【问题描述】:
或者这个问题可以这样解释: 为什么需要一种下界非零的数据类型?
考虑以下示例:
struct S {
int a;
int b;
float c;
float d;
} array[N];
如果我有一个 S[] 类型的数组,并且我只想发送字段 b 和
d,我将使用类型映射 { (4, MPI_INT), (12, MPI_FLOAT) } 创建一个 datatype。
起初,似乎这种类型可以用来正确发送一个数组
struct S:
MPI_Send(array, N, datatype, ...);
但是如果N > 1,这不起作用。
这样的类型将有lb = 4、ub = 16 和extent = ub - lb = 12。那是,
MPI 会认为数组的第二个元素从 12 个字节开始
第一个,这不是真的。
嗯,这可能没什么大不了的。毕竟,一般来说,对于这种部分发送的结构 我们必须指定结构的确切大小:
MPI_Type_create_resized(datatype, 0, sizeof(struct S), &resized);
但我想知道为什么我们总是需要指定零下限。为什么会 有人需要非零下限吗?下界非零的数据类型让我非常困惑,我无法理解它们。
如果我要为 MPI 设计一个类型系统,我会用一个单一的
参数 - 它的大小(范围),它是数组的两个相邻元素之间的步幅。在 MPI 方面,我总是设置lb = 0 和extent = ub。这样的系统在我看来更加清晰,并且在上述示例中可以正常工作。
但 MPI 选择了不同的方式。我们有两个 独立 参数:较低的 和上限。为什么会这样?这种额外的灵活性有什么用?什么时候应该使用具有非零下限的数据类型?
【问题讨论】:
标签: mpi