Определение пользовательского типа MPI на основе директивы препроцессора - PullRequest
0 голосов
/ 02 мая 2020

Просто быстрый вопрос о типах данных 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_FLOAT и MPI_DOUBLE не вполне то, что я ожидал бы от них. Есть ли это легко исправить? Я, наверное, просто что-то здесь упускаю.

1 Ответ

2 голосов
/ 03 мая 2020

MPI_FLOAT и MPI_DOUBLE являются не типами (например, float или double), но "переменными" типа MPI_Datatype, поэтому синтаксис C ++ using не может использоваться здесь.

FWIW, MPI_Datatype - непрозрачный тип, который реализован как

  • и int в MPICH и его производных (а 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 ++ i sh способ сделать это, но я не тот человек, чтобы советовать об этом.

...