MPI_Recv/MPI_发送开销 我正在研究C++应用程序,在这里我使用MPI C绑定来通过网络发送和接收数据。我理解这一点 const int VECTOR_SIZE = 1e6; std::vector<int> vector(VECTOR_SIZE, 0.0); const int VECTOR_SIZE=1e6; 标准::向量向量(向量大小,0.0);

MPI_Recv/MPI_发送开销 我正在研究C++应用程序,在这里我使用MPI C绑定来通过网络发送和接收数据。我理解这一点 const int VECTOR_SIZE = 1e6; std::vector<int> vector(VECTOR_SIZE, 0.0); const int VECTOR_SIZE=1e6; 标准::向量向量(向量大小,0.0);,c++,mpi,C++,Mpi,通过 //版本A MPI_发送(const_cast(vector.data())、vector.size()、MPI_INT、1、0、MPI_COMM_WORLD); 它的效率比 // Version B for (const auto &element : vector) MPI_Send(const_cast<int *>(&element), 1, MPI_INT, 1, 0, MPI_COMM_WORLD); //版本B 用于(常量自动和元素:矢

通过

//版本A
MPI_发送(const_cast(vector.data())、vector.size()、MPI_INT、1、0、MPI_COMM_WORLD);
它的效率比

// Version B
for (const auto &element : vector)
    MPI_Send(const_cast<int *>(&element), 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
//版本B
用于(常量自动和元素:矢量)
MPI_发送(常量转换和元素),1,MPI_INT,1,0,MPI_COMM_WORLD);

由于
MPI\u Send
引入的延迟。但是,如果我想发送内存中不连续的数据结构(例如a
std::list
),我不能使用版本a,但必须先使用版本B或将列表内容复制到连续容器(例如
std::vector
)中,然后使用版本a。因为我想避免额外的副本,我想知道MPI中是否有任何选项/其他函数允许有效使用版本B(或至少是类似的循环结构)如果每次调用
MPI\u Send
时都不产生延迟,那么通过
std::list
元素单步执行并逐个发送确实会造成巨大的通信开销

规范/库设计为独立于语言。这就是为什么它使用语言不可知论。其结果是,它只能从连续缓冲区(这是大多数语言提供的功能)发送,而不能从更复杂的数据结构(如列表)发送

为了避免逐个发送的通信开销,有两种选择:

  • 将所有列表元素复制到
    std::vector
    中,并发送该向量。但是,这会造成内存溢出,并使发送完全按顺序进行(在此期间,某些MPI节点可能会中断)

  • 或者遍历列表,构建较小的向量/缓冲区并发送这些较小的块(最终将它们发送到多个目标节点?)。这种方法的好处是通过管道化效果更好地利用。不过,您必须进行一点实验,以找到中间块的位置


您可以看看Boost MPI,因为它支持STL容器。
// Version B
for (const auto &element : vector)
    MPI_Send(const_cast<int *>(&element), 1, MPI_INT, 1, 0, MPI_COMM_WORLD);