繁体   English   中英

使用通过MPI_Type_struct()创建的派生类型时,MPI_reduce的“计数”参数应该是什么?

[英]What should be the 'count' paramerter of MPI_reduce when using derived types created with MPI_Type_struct()?

我不确定我是否正确理解了'count'参数之间的区别:

    int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, 
           MPI_Op op, int root, MPI_Comm comm);

以及'blocklens'参数:

int MPI_Type_struct(int count,
               int blocklens[],
               MPI_Aint indices[],
               MPI_Datatype old_types[],
               MPI_Datatype *newtype);

假设我要执行我自己的类型的归约:

typedef struct buffers_s
{
   double *buf1, *buf2;
} Buffers;

其中buf1和buf2都分配给N个元素。

然后,当调用MPI_Type_struct()基于“缓冲区”创建新的mpi类型“ Custom_MPI_Type”时,我会将“ count”设置为2,blocklens [0]设置为N,blocklens [1]也设置为N。

然后,在创建MPI类型时,假设我还创建了归约运算符“ MyOp”,则将“数据类型”设置为“ Custom_MPI_Type”的情况调用MPI_Reduce()。 那么'count'参数的值应该是什么?

根据我将其设置为N的经验,但是,考虑到我已经指定了我刚刚创建的MPI类型是由2个长度为N的块构成的,所以我并不真正理解它的含义。

换句话说,当将MPI_Reduce()与基本类型的数组(例如MPI_FLOAT)一起使用时,“ count”参数指定MPI_FLOAT类型的元素数量,其起始地址为MPI_Reduce()的第一个参数。我们已经期望在使用自定义数据类型时将count设置为Custom_MPI_Type类型的1个元素,前提是MPI已经知道该类型由2个NMP元素组成,这些N个元素具有给定的基本MPI_Datatype,例如MPI_DOUBLE。

有人可以解释所有这些吗?

MPI中的派生数据类型通常不适用于诸如Buffers类的类型。 乔纳森·杜尔西(Jonathan Dursi)在您的另一个问题中解释了原因。 该结构数据类型意味着可以使用C / C ++结构,例如:

#define N 1000

typedef struct buffers_s
{
   double buf1[N], buf2[N];
} Buffers;

在这种情况下,与buf1buf2对于Buffers实例的开头的偏移量始终相同,这与buf1buf2都指向动态分配的内存时不同。

blocklengthsMPI_Type_create_structblocklengths参数(在MPI-2中已弃用MPI_Type_struct ,甚至在MPI-3.0中已删除,因此您不应该使用它)用于描述数据类型本身的形状。 blocklengts[i]告诉MPI在新数据类型的第i个元素中包含了old_types[i]类型的元素。 对于上述结构, blocklengths[0] = blocklengths[1] = N

MPI_Reducecount参数告诉MPI有多少datatype元素要减少。 如果datatype是您的结构数据类型,则表示有多少个结构实例。 继续上面的示例代码,如果您有10个Buffers实例的数组,例如:

Buffers bufs[10];

那么您将在count参数中提供10 这与结构类型构造函数中的块计数完全正交。 单个进程传递的元素总数将是count乘以blocklengts[]所有元素之和。 您已正确得出结论,如果仅减少派生数据类型的一个元素,则应将count设置为1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM