【发布时间】:2017-05-04 14:38:23
【问题描述】:
我知道在 C 中不允许对 void 指针进行算术运算。但是我必须找到解决这个问题的方法。
我有一个函数将数组的前半部分发送到排名 0,将后半部分发送到排名 1:
void send_expand_multiple(void * data, MPI_Datatype datatype, int size) {
int my_rank, comm_size, intercomm_size, localSize, factor, dst, iniPart, iniPartBytes, i;
int datatype_size;
MPI_Type_size(datatype, &datatype_size);
int local_size = size / 2;
//Sending the first half
MPI_Send(data, local_size, datatype, dst, 0, comm);
//Sending the second half
int iniPart = local_size;
int iniPartBytes = iniPart * datatype_size;
MPI_Send(((char *) data) + iniPartBytes, local_size, datatype, dst, 1, comm);
}
我的解决方案是基于“序列化”的原则。前半部分没有问题,但后半部分我解析了缓冲区并通过添加该值来移动指针 iniPartBytes。
最后,计数和数据类型配置 MPI_Send 以便发送 datatype 类型的 local_size 元素。
我的方法正确吗?
【问题讨论】:
-
int local_size = size / 2;可以在奇数的情况下丢失 1 个字节 -
这是对代码的简化,所以我们假设它不可能是奇数。谢谢。
-
@EugeneSh。你是对的。我的错,对不起。现在已编辑。
-
你确实陈述了一个问题,所以它是 OT 上的。你可以在codereview.stackexchange.com/获得更多好运
-
@LPs 这就是我的想法,但是那里的用户重定向了我...