如何使用Boost.MPI正确使用内置`MPI_DOUBLE_COMPLEX`作为`std :: complex <double>`?

时间:2016-11-18 18:30:48

标签: c++ boost mpi boost-mpi

我想使用Boost.MPI传输大量int main(int argc, char **argv) { unsigned long physical_addr; uint8_t *buf; unsigned long virtual_addr; char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0); int i; for (i = 0; i * sizeof(*my_memory) < 10000; i++) { my_memory[i][0] = 1; } } 个数字。在Boost.MPI tutorial中解释了

  

要获得小型固定长度数据类型的最佳性能   包含任何指针,使用它来标记它们是非常重要的   类型特征Boost.MPI和Boost.Serialization。

     

已经讨论了包含否的固定长度类型   指针可以用作std::complex<double>,例如:

is_mpi_datatype
     

或等效的宏

namespace boost { namespace mpi {   template <>   struct
is_mpi_datatype<gps_position> : mpl::true_ { }; } }

documentation of is_mpi_datatype给出了另一个例子:

  

[...]要这样做,先做   数据类型Serializable(使用Boost.Serialization库);   然后,为BOOST_IS_MPI_DATATYPE(gps_position) 类型专门设置is_mpi_datatype特征,以便这样做   它会point

derive mpl::true_

当我尝试这样做以优化性能[我在下面的尝试中选项(A)或(B)]时,我发现Boost.MPI不使用内置MPI数据类型namespace boost { namespace mpi { template<> struct is_mpi_datatype<point> : public mpl::true_ { }; } } ,也没有映射到MPI_DOUBLE_COMPLEX操作[我在下面的尝试中断言(3)和(4)]。此外,启用(A)或(B)之一以及禁用断言(3)和(4)会在运行时产生分段错误。

some source file of Boost.MPI中,我找到了一个名为MPI_SUM的无证(?)宏,它做了正确的事情,但标有BOOST_MPI_DATATYPE注释。

在实现这个丑陋的黑客(?)之前,我想问一下:告诉Boost.MPI使用内置/// INTERNAL ONLY MPI_DOUBLE_COMPLEX数据类型的预期方法是什么?

std::complex<double>

0 个答案:

没有答案