发送部分 MPI 消息

Sending partial MPI messages

为了避免分配中间缓冲区,在我的应用程序中我的 MPI_Recv 接收一个大数组是有意义的,但在发送端,数据是不连续的,我喜欢它尽快将数据组织到网络接口上。像这样:

MPI_Request reqs[N];
for(/* each one of my N chunks */) {
    partial_send(chunk, &reqs[chunk->idx]);
}

MPI_Waitall(N, reqs, MPI_STATUSES_IGNORE);

或者对我来说更好,像 POSIX 的 writev 函数一样:

/* Precalculate this. */
struct iovec iov[N];
for(/* each one of my N chunks */) {
    iov[chunk->idx].iov_base = chunk->ptr;
    iov[chunk->idx].iov_len = chunk->len;
}

/* Done every time I need to send. */
MPI_Request req;
chunked_send(iov, &req);
MPI_Wait(req, MPI_STATUS_IGNORE);

在 MPI 中可以实现这样的事情吗?

我想简单地发表评论,但不能,因为我是堆栈溢出的新手并且没有足够的声誉...

如果您的所有块都在规则边界上对齐(例如,它们是指向某个更大的连续数组的指针),那么您应该使用 MPI_Type_indexed,其中位移和计数均以基本类型的倍数测量(我猜是 MPI_DOUBLE)。但是,例如,如果块已被单独分配并且不能保证对齐,那么您将需要使用更通用的 MPI_Type_create_struct 以字节为单位指定位移(并且还允许每个不同的类型您不需要的块)。

我担心你可能需要做一些排序来确保你线性扫描内存,这样位移就不会倒退(即它们是 "monotonically nondecreasing")。但是,我相信这只是一个限制条件,如果您打算将文件 IO 类型与 MPI-IO 一起使用,而不是用于点对点 send/recv.