什么是';计数';使用使用MPI_Type_struct()创建的派生类型时MPI_reduce的参数?
我不确定我是否正确理解了中“count”参数之间的区别:什么是';计数';使用使用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[],
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行。