Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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_Type_struct()创建的派生类型时MPI_reduce的参数?_C_Parallel Processing_Mpi - Fatal编程技术网

什么是';计数';使用使用MPI_Type_struct()创建的派生类型时MPI_reduce的参数?

什么是';计数';使用使用MPI_Type_struct()创建的派生类型时MPI_reduce的参数?,c,parallel-processing,mpi,C,Parallel Processing,Mpi,我不确定我是否正确理解了中“count”参数之间的区别: int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm); 和“块透镜”参数: int MPI_Type_struct(int count, int blocklens[],

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

    int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, 
           MPI_Op op, int root, MPI_Comm comm);
和“块透镜”参数:

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”,我将调用MPI\u Reduce(),并将“datatype”设置为“Custom\u MPI\u type”。那么“count”参数的值应该是多少

根据我的经验,将其设置为N可以工作,但是我并不真正理解其含义,因为我已经指定我刚刚创建的MPI类型由2个长度为N的块组成

换句话说,当将MPI_Reduce()用于基本类型的数组(如MPI_FLOAT)时,“count”参数指定MPI_FLOAT类型的元素数,从作为MPI_Reduce()的第一个参数给定的地址开始。。。因此,从逻辑上讲,我希望在使用自定义数据类型时,将count设置为custom\u MPI\u类型的1个元素,前提是MPI已经知道该类型由给定基本MPI\u数据类型(如MPI\u DOUBLE)的2个N元素块组成


有人能解释一下吗?

MPI中的派生数据类型通常不适用于
缓冲区之类的类型。Jonathan Dursi在你的报告中解释了原因。结构数据类型意味着使用C/C++结构,例如:

#define N 1000

typedef struct buffers_s
{
   double buf1[N], buf2[N];
} Buffers;
在这种情况下,
buf1
buf2
Buffers
实例开始的偏移量总是相同的,这与
buf1
buf2
都指向动态分配的内存的情况不同

这就是说,
MPI\u Type\u create\u struct
blocklength
参数(
MPI\u Type\u struct
在MPI-2中被弃用,甚至在MPI-3.0中被删除,因此您不应该使用它)用于描述数据类型本身的形状
blocklengts[i]
告诉MPI在新数据类型的第i个元素
i
中包含了多少类型为
old\u类型[i]
的元素。对于上述结构,
blockLength[0]=blockLength[1]=N

MPI\u Reduce
count
参数告诉MPI有多少
数据类型的元素需要减少。如果
datatype
是您的结构数据类型,则表示该结构有多少实例。继续上面的示例代码,如果您有一个包含10个
缓冲区实例的数组,例如:

Buffers bufs[10];

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

这里有一个代码可以实现这一点:我不明白的是,尽管我已经指定了第25行和第26行,但为什么我必须将“size”放在第217行。