基于预处理器指令定义自定义 MPI 类型

Defining custom MPI type based on preprocessor directive

只是一个关于 MPI 数据类型的快速问题,我想通过预处理器指令提供单精度和双精度支持。对于我的顺序程序,我做

#if defined(USE_SINGLE_PRECISION)
  using floatT = float;
#elif defined(USE_DOUBLE_PRECISION)
  using floatT = double;
#endif

我天真地认为我可以为 MPI 做类似的事情,即

#if defined(USE_SINGLE_PRECISION)
  using MPI_FLOAT_T = MPI_FLOAT;
#elif defined(USE_DOUBLE_PRECISION)
  using MPI_FLOAT_T = MPI_DOUBLE;
#endif

不过,MPI_FLOATMPI_DOUBLE 似乎并不是我所期望的那样。有没有简单的解决方法?我可能只是在这里遗漏了一些东西。

MPI_FLOATMPI_DOUBLE 不是 类型(如 floatdouble),但是 "variables" MPI_Datatype 类型,因此不能在此处使用 C++ using 语法。

FWIW,MPI_Datatype 是实现为

的不透明类型
  • MPICH 及其衍生物中的 int(并且 MPI_FLOAT 是硬编码整数)
  • Open MPI 中的不透明指针

解决您的问题的一种便携方法是

#if defined(USE_SINGLE_PRECISION)
  #define MPI_FLOAT_T MPI_FLOAT
#elif defined(USE_DOUBLE_PRECISION)
  #define MPI_FLOAT_T MPI_DOUBLE
#endif

请注意,可能有更像 C++ 的方式来做这件事,但我不是就此提出建议的合适人选。