gpt4 book ai didi

使用 MPI_Datatype 进行 C 转换

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:28 25 4
gpt4 key购买 nike

我有一个存储在不透明结构中的数组列表,它们的所有类型都不同。我有一个函数可以将它们还给我,并将它们存储为 void * 数组。我有另一个函数,它给我它们的类型作为 MPI_Datatype

当我操作这些数组时,我将它们转换为 byte *。但是 byte 是 8 位长的数据类型,而我的数组类型可以是 16、32 或 64 位长。

那么,这些是否会在访问良好单元和“使用”大量比特方面产生一些问题?

如果是,是否有办法将我的数组转换为存储为 MPI_Datatype 的类型?

举个例子

void * intab;
void * out1tab;
void * out2tab;
int tag;
int j;
MPI_Datatype type;
Iterator vaiter;

IteratInit (inStruct, &vaiter);

while (IteratHasMore(&vaiter)) {

tag = IteratCurTagNum (&vaiter);
type = IteratCurTypeVal (&vaiter);

ValueLink (out1Struct, (void**) &out1tab, type, tag));
ValueLink (out2Struct, (void**) &out2tab, type, tag));

intab = IteratCurValue (&vaiter);

for (j = baseval ; j < nbr + baseval ; ++j) {
if (flagtab[j] == 1) {
((byte*)out1tab)[j] = ((byte*)intab)[j];
}
else {
((byte*)out2tab)[j] = ((byte*)intab)[j];
}
}

IteratNext(&vaiter);
}

最佳答案

MPI 数据类型是告诉 MPI 在构造和解构消息时如何访问和解释内存内容的蓝图。 MPI只关心二进制内容的布局,对它对应的语言类型一无所知,比如它是数组还是同类型元素的结构,如果是结构,它的字段如何命名. MPI 数据类型只是 MPI 库管理的不透明结构的句柄。

虽然从 MPI 数据类型构造语言类型几乎是不可能的,至少在静态类型语言(例如 C)中不是这样,但仍然可以查询 MPI 数据类型的内部并对其中的元素执行操作内存。该过程大致如下(请注意 - 这远非微不足道):

  • 您应该首先使用 MPI_Type_get_envelope 获取数据类型信封,它为您提供了有关用于创建数据类型的 MPI 数据类型构造函数调用(组合器)的一些基本信息。对于使用 MPI_Type_struct(已弃用)和 MPI_Type_create_struct 创建的结构数据类型,组合器将为 MPI_COMBINER_STRUCT。对于使用 MPI_Type_contiguous 创建的连续(数组)数据类型,组合器将为 MPI_COMBINER_CONTIGUOUS,对于使用 MPI_Type_vector 创建的 vector 数据类型(跨步 block ),组合器将为MPI_COMBINER_VECTOR。完整列表可以在 MPI 标准或上面链接的 Open MPI 手册页中找到。

  • 鉴于 MPI_Type_get_envelope 的结果,您应该分配足够大的整数、偏移量和 MPI 数据类型数组,然后调用 MPI_Type_get_contents获取数据类型构造函数的实际参数。

  • 由于 MPI 允许几乎无限的数据类型嵌套,您应该进一步递归到每个数据类型,直到您到达 MPI_COMBINER_NAMED 的组合器,它对应于预定义的 MPI 数据类型。从那里开始,基本语言类型就很简单了。

上述过程将为您提供基本语言类型列表及其相对于数据缓冲区开头的偏移量,即所谓的类型映射。您可以使用每个元素的偏移量和一个大的 switch 语句来相应地处理它。您仍然无法在源代码中执行转换。后者可能在一些动态脚本语言中是可能的,这些语言允许通过使用一些内省(introspection)机制来构造语言类型。

充其量,如果程序中使用的 MPI 数据类型数量有限,您应该使用带有 MPI 数据类型句柄的 switch 运算符并分别转换为相应的语言类型,最好不要使用一些奇怪的预处理器宏解决方案。

关于使用 MPI_Datatype 进行 C 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38008005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com