发送数据:MPI_Type_contiguous vs 基本类型
sending data: MPI_Type_contiguous vs primitive types
我正在尝试交换数据(30 个字符)b/w 两个进程以将 MPI_Type_contiguous 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_Type_contiguous 优于 原始类型 (就 performance/ease 完成任务)?
MPI_Type_contiguous
用于创建新数据类型,它是现有数据类型的 count
副本。这对于简化将多个数据类型一起发送的过程很有用,因为您不需要跟踪它们的组合大小(MPI_send
中的 count
可以替换为 1)。
对于你的情况,我认为是完全一样的。 using MPI 中的文字经过稍微调整以符合您的示例,
When a count argument is used in an MPI operation, it is the same as if a contigous type of that size has been constructed.
MPI_Send(data, count, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
is exactly the same as
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_Send
的 count
参数是 int
类型,在典型的 LP64(类 Unix OSes)或 LLP64(Windows)64 位OS 无法直接发送超过 231-1 个元素,即使 MPI 实现在内部使用 64 位长度。对于具有数百 GiB RAM 的现代计算节点,这变得很麻烦。解决方案是创建一个长度为 m
的新数据类型,并发送新类型的 n
个元素,总共 n*m
个数据元素,其中 n*m
现在可以达到262-232+1。该方法是面向未来的,也可以在 128 位机器上使用,因为 MPI 数据类型可以进一步嵌套。 MPI 论坛使用这种变通方法以及注册数据类型(在执行时间上)比遍历网络所花费的时间更便宜的事实来拒绝添加新的大量 API 或修改现有类型的参数类型。 Jeff Hammond (@Jeff) 写了一个 library 来简化这个过程。
另一个用途是在 MPI-IO 中。使用 MPI_File_set_view
设置文件视图时,可以提供连续数据类型作为基本数据类型。它允许一个人例如在没有内置复数数据类型的语言(如早期版本的 C)中,以更简单的方式处理复数的二进制文件。
我正在尝试交换数据(30 个字符)b/w 两个进程以将 MPI_Type_contiguous 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_Type_contiguous 优于 原始类型 (就 performance/ease 完成任务)?
MPI_Type_contiguous
用于创建新数据类型,它是现有数据类型的 count
副本。这对于简化将多个数据类型一起发送的过程很有用,因为您不需要跟踪它们的组合大小(MPI_send
中的 count
可以替换为 1)。
对于你的情况,我认为是完全一样的。 using MPI 中的文字经过稍微调整以符合您的示例,
When a count argument is used in an MPI operation, it is the same as if a contigous type of that size has been constructed.
MPI_Send(data, count, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
is exactly the same as
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_Send
的 count
参数是 int
类型,在典型的 LP64(类 Unix OSes)或 LLP64(Windows)64 位OS 无法直接发送超过 231-1 个元素,即使 MPI 实现在内部使用 64 位长度。对于具有数百 GiB RAM 的现代计算节点,这变得很麻烦。解决方案是创建一个长度为 m
的新数据类型,并发送新类型的 n
个元素,总共 n*m
个数据元素,其中 n*m
现在可以达到262-232+1。该方法是面向未来的,也可以在 128 位机器上使用,因为 MPI 数据类型可以进一步嵌套。 MPI 论坛使用这种变通方法以及注册数据类型(在执行时间上)比遍历网络所花费的时间更便宜的事实来拒绝添加新的大量 API 或修改现有类型的参数类型。 Jeff Hammond (@Jeff) 写了一个 library 来简化这个过程。
另一个用途是在 MPI-IO 中。使用 MPI_File_set_view
设置文件视图时,可以提供连续数据类型作为基本数据类型。它允许一个人例如在没有内置复数数据类型的语言(如早期版本的 C)中,以更简单的方式处理复数的二进制文件。