Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有MPI_数据类型的C转换_C_Casting_Mpi - Fatal编程技术网

带有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\u-combiner\u-vector
    。完整列表可在MPI标准或上面链接的打开的MPI手册页面中找到

  • 给定
    MPI\u Type\u get\u envelope
    的结果,您应该分配足够大的整数、偏移量和MPI数据类型数组,然后调用以获取数据类型构造函数的实际参数

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

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


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

我不完全理解这个问题,但如果您没有该类型,很明显,你不能这么做。你的问题很难理解。你写道:“我有一个数组列表存储在一个不透明的结构中,它们的类型都是不同的。”。你说的“他们的类型”是什么意思?数组元素的类型是什么?还是数组的长度?请给出
MPI\u数据类型的具体示例。它们是元素类型还是完整数组类型。一般来说,您如何知道数组的长度?什么是
outNtab
?术语
void*
数组也不明确。什么是
flagtab
?请仔细选择你的措辞。如果您不知道确切的措辞,请更详细。@Zulan:“他们的类型”=>数组元素的类型<代码>MPI_数据类型
MPI_INT
MPI_DOUBLE
。。。在本例中,长度为
nbr
,我知道