带有MPI_数据类型的C转换
我有一个存储在不透明结构中的数组列表,它们的所有类型都不同。我有一个函数将它们返回给我,并将它们存储为带有MPI_数据类型的C转换,c,casting,mpi,C,Casting,Mpi,我有一个存储在不透明结构中的数组列表,它们的所有类型都不同。我有一个函数将它们返回给我,并将它们存储为void*数组。我还有一个函数,它将它们的类型作为MPI\U数据类型提供给我 当我操作这些数组时,我将它们转换为字节*。但是byte是8位长的数据类型,而我的数组类型可以是16、32或64位长 那么,这些是否会在访问好的单元和“使用”好的比特数方面产生一些问题 如果是,是否有方法使用存储为MPI_数据类型的类型强制转换我的数组 这里有一个例子 void * intab; void * out1t
void*
数组。我还有一个函数,它将它们的类型作为MPI\U数据类型提供给我
当我操作这些数组时,我将它们转换为字节*
。但是byte
是8位长的数据类型,而我的数组类型可以是16、32或64位长
那么,这些是否会在访问好的单元和“使用”好的比特数方面产生一些问题
如果是,是否有方法使用存储为MPI_数据类型的类型强制转换我的数组
这里有一个例子
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);
}
void*intab;
void*out1tab;
void*out2tab;
int标签;
int j;
MPI_数据类型;
迭代器;
迭代初始化(指令和变量);
while(迭代hasmore(&vaiter)){
tag=IterateCurtagnum(&vaiter);
类型=IterateCurTypeVal(&vaiter);
ValueLink(out1Struct,(void**)和out1tab,type,tag);
ValueLink(out2Struct,(void**)和out2tab,type,tag);
intab=迭代曲线值(&vaiter);
对于(j=baseval;j
像这样的东西
#define COPY_ELEMENT(type) \
do { \
if (flagtab[j] == 1) { \
((type*)out1tab)[j] = ((type*)intab)[j]; \
} \
else { \
((type*)out2tab)[j] = ((type*)intab)[j]; \
} \
j += sizeof(type); \
} while(0)
for (j = baseval ; j < nbr + baseval ; ) { // no j++, j is advanced by COPY_ELEMENT
switch (type) {
case MPI_BYTE:
COPY_ELEMENT(byte);
break;
case MPI_SHORT:
COPY_ELEMENT(short);
break;
case MPI_INT:
COPY_ELEMENT(int);
break;
// all cases?
}
}
#定义复制元素(类型)\
做{\
如果(flagtab[j]==1){\
((type*)out1tab)[j]=((type*)intab)[j]\
} \
否则{\
((type*)out2tab)[j]=((type*)intab)[j]\
} \
j+=sizeof(类型);\
}而(0)
对于(j=baseval;j
(警告:未对此进行测试)MPI数据类型是蓝图,告诉MPI在构造和解构消息时如何访问和解释内存内容。MPI只关心二进制内容的布局,不知道与之对应的语言类型,比如它是数组还是相同类型元素的结构,如果是结构,它的字段如何命名。MPI数据类型只是MPI库管理的不透明结构的句柄 虽然从MPI数据类型构造语言类型几乎是不可能的,至少在静态类型语言(如C)中是不可能的,但仍然可以查询MPI数据类型的内部并对内存中的元素执行操作。程序大致如下(请注意,这绝非小事):
- 您应该首先使用获取数据类型信封,它为您提供了有关用于创建数据类型的MPI数据类型构造函数调用(组合器)的一些基本信息。对于使用
(已弃用)和MPI\u-Type\u-struct
创建的结构数据类型,合并器将为MPI\u-Type\u-create\u-struct
。对于使用MPI\u-combiner\u-struct
创建的连续(数组)数据类型,组合器将是MPI\u-Type\u-continuous
,对于使用MPI\u-combiner\u-continuous
创建的向量数据类型(跨步块),组合器将是MPI\u-Type\u-vector
。完整列表可在MPI标准或上面链接的打开的MPI手册页面中找到MPI\u-combiner\u-vector
- 给定
的结果,您应该分配足够大的整数、偏移量和MPI数据类型数组,然后调用以获取数据类型构造函数的实际参数MPI\u Type\u get\u envelope
- 由于MPI允许几乎无限的数据类型嵌套,您应该进一步递归到每个数据类型,直到到达名为的
MPI\u combiner\u的组合器,该组合器对应于预定义的MPI数据类型。从那以后,基本的语言类型就很简单了
switch
语句来相应地处理它。您仍然无法在源代码中执行强制转换。后者在某些动态脚本语言中是可能的,该语言允许通过使用某种内省机制来构造语言类型
充其量,如果程序中使用的MPI数据类型数量有限,您应该使用带有MPI数据类型句柄的
开关操作符,并将其单独转换为相应的语言类型,最好不要使用一些奇怪的预处理器宏解决方案。我不完全理解这个问题,但如果您没有该类型,很明显,你不能这么做。你的问题很难理解。你写道:“我有一个数组列表存储在一个不透明的结构中,它们的类型都是不同的。”。你说的“他们的类型”是什么意思?数组元素的类型是什么?还是数组的长度?请给出MPI\u数据类型的具体示例。它们是元素类型还是完整数组类型。一般来说,您如何知道数组的长度?什么是outNtab
?术语void*
数组也不明确。什么是flagtab
?请仔细选择你的措辞。如果您不知道确切的措辞,请更详细。@Zulan:“他们的类型”=>数组元素的类型<代码>MPI_数据类型
:MPI_INT
,MPI_DOUBLE
。。。在本例中,长度为nbr
,我知道