c ++ неизвестное соглашение о вызовах - PullRequest
3 голосов
/ 27 июня 2019

Пакет, который я создаю (SPRNG, ссылка здесь , но не нужен для этого вопроса), использует синтаксис вызова в некоторых местах, с которыми я не знаком. Для моего предыдущего стека зависимостей (Intel 16.0 с OpenMPI 1.10.1) это работало. К сожалению, мой текущий стек (Intel 19 с OpenMPI 3.1.3) не нравится. Я не c++ человек, и при этом я не хочу существенно изменять пакет, если я не должен.

Пример кода:

#include <mpi.h>

int main(int argc, char *argv[]) {
  int myid;

  MPI::Init(argc, argv);
  myid = MPI::COMM_WORLD.Get_rank();
}

На предыдущем стеке все было хорошо:

$ mpic++ --version
icpc (ICC) 16.0.0 20150815
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.

$ mpirun --version
mpirun (Open MPI) 1.10.1

Report bugs to http://www.open-mpi.org/community/help/
$ mpic++ sprng_issue.cpp
<no errors>

Но с новым стеком:

$ mpic++ --version
icpc (ICC) 19.0.1.144 20181018
Copyright (C) 1985-2018 Intel Corporation.  All rights reserved.

$ mpirun --version
mpirun (Open MPI) 3.1.3

Report bugs to http://www.open-mpi.org/community/help/
$ mpic++ sprng_issue.cpp 
sprng_issue.cpp(6): error: name followed by "::" must be a class or namespace name
    MPI::Init(argc, argv);
    ^

sprng_issue.cpp(7): error: name followed by "::" must be a class or namespace name
    myid = MPI::COMM_WORLD.Get_rank();
           ^

compilation aborted for sprng_issue.cpp (code 2)

Мои вопросы:

  1. Есть ли имя для этого вызывающего метода? У меня были проблемы с поиском, потому что это просто. Насколько это странно / старо / нестандартно?

  2. Существует ли флаг компилятора (Intel или другие) для включения устаревшего поведения?

  3. Любые другие рекомендации для простого способа пройти без существенного изменения кода пакета?

1 Ответ

6 голосов
/ 27 июня 2019

C++ привязки были удалены из стандарта много лет назад, и они больше не создаются по умолчанию в Open MPI.

В долгосрочной перспективе вы должны модернизировать свой код (используйте обычный Cпривязки или другой уровень абстракции, такой как Boost.MPI).

Между тем, вы можете просто перестроить Open MPI с помощью configure --enable-mpi-cxx.

...