发送数据:MPI\u类型\u连续与基本类型

发送数据:MPI\u类型\u连续与基本类型,mpi,Mpi,我试图通过两个进程交换数据(30个字符),以理解MPI类型连续API: char data[30]; MPI_Type_contiguous(10,MPI_CHAR,&mytype); MPI_Type_commit(&mytype); MPI_Send(data, 3,mytype,1, 99,MPI_COMM_WORLD); 但类似的任务可以通过以下方式完成: MPI_Send(data, 30,MPI_CHAR,1, 99,MPI_COMM_WORLD); 我想这并没有

我试图通过两个进程交换数据(30个字符),以理解MPI类型连续API:

char data[30];
MPI_Type_contiguous(10,MPI_CHAR,&mytype);
MPI_Type_commit(&mytype);
MPI_Send(data, 3,mytype,1, 99,MPI_COMM_WORLD);
但类似的任务可以通过以下方式完成:

MPI_Send(data, 30,MPI_CHAR,1, 99,MPI_COMM_WORLD);
我想这并没有延迟因素的优势,因为我在这两种情况下都只使用单个函数调用(或者是吗?)


任何人都可以共享一个用例,其中MPI\u-Type\u-continuous在性能/完成任务的容易性方面优于基本类型

MPI\u-Type\u-continuous
用于创建一个新的数据类型,该数据类型是现有数据类型的
count
副本。这对于简化同时发送多个数据类型的过程非常有用,因为您不需要跟踪它们的组合大小(
count
in
MPI\u send
中的
可替换为1)

就你的情况而言,我认为完全一样。根据您的示例稍微修改的文本是

在MPI操作中使用count参数时,与构造该大小的连续类型相同

MPI_Send(data, count, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
完全一样

MPI_Type_contiguous(count, MPI_CHAR, &mytype);
MPI_Type_commit(&mytype);
MPI_Send(data, 1, mytype, 1, 99, MPI_COMM_WORLD);
MPI_Type_free(&mytype);

您是对的,因为只有一个实际的通信呼叫,所以延迟将是相同的(带宽和发送的字节数相同)。

一个立即想到的用途是发送非常大的消息。由于
MPI\u Send
count
参数的类型为
int
,因此在典型的LP64(类Unix操作系统)或LLP64(Windows)64位操作系统上,即使MPI实现在内部使用64位长度,也不可能直接发送超过231-1个元素。随着现代计算节点拥有数百GiB的RAM,这正成为一个麻烦。解决方案是创建一个长度为
m
的新数据类型,并为总共
n*m
数据元素发送新类型的
n
元素,其中
n*m
现在可以达到262-232+1。该方法是经得起未来考验的,还可以在128位机器上使用,因为MPI数据类型可以进一步嵌套。MPI论坛利用这一变通方法以及注册数据类型(在执行时间上)比通过网络所需的大量消息要便宜得多的事实,拒绝了添加新的大量API或修改现有API参数类型的建议。杰夫·哈蒙德(@Jeff)写了一篇文章来简化这个过程

另一个用途是MPI-IO。使用
MPI\u file\u set\u view
设置文件视图时,可以提供连续数据类型作为基本数据类型。例如,它允许人们以一种更简单的方式处理没有内置复杂数据类型(如早期版本的C)的语言中的复数二进制文件