Использование OpenMP с C ++ 11 в Mac OS

Я пытаюсь использовать некоторые функции многопоточности OpenMP в своем коде на C ++ 11, например:

#pragma omp parallel for

Когда я пытаюсь скомпилировать, используя:

clang++ -std=c++11 -stdlib=libc++ -fopenmp main.cpp -o main.o

Я получаю следующую ошибку:

clang: error: unsupported option '-fopenmp'

В качестве альтернативы я попытался скомпилировать, используя:

g++ -fopenmp main.cpp -o main.o

Но это дает точно такую ​​же ошибку.

Был бы очень признателен, если бы вы посоветовали мне скомпилировать код C ++ 11 с функциями OpenMP в Mac OS 10.12. Другие вопросы к сообщениям здесь и в других местах объясняют компиляцию кода C для OpenMP, однако я не смог найти ничего для C ++ 11.

Я получаю сообщение об ошибке при попытке установить libiomp, я получаю сообщение об ошибке:

$ brew install libiomp
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
ansible-cmdb        djview4             khard               oysttyer            shyaml              yazpp             
asciinema2gif       doctl               macvim              pazpar2             vala                you-get           
avro-c              elixir              mailhog             python              vdirsyncer          youtube-dl        
bash-git-prompt     file-roller         meson               python3             vim               
commandbox          glib                metaproxy           rtv                 x265              
consul-backinator   gtkextra            offlineimap         s-search            xonsh             

Error: Could not link:
/usr/local/share/doc/homebrew

Please delete these paths and run `brew update`.
Error: Could not link:
/usr/local/share/man/man1/brew.1

Please delete these paths and run `brew update`.
Error: No available formula with the name "libiomp" 
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.

Если я использую g ++ - 6, основываясь на сообщении Марка Сетчелла ниже, он работает нормально, спасибо, однако я получаю следующие предупреждения, буду признателен за любые предложения о том, как их избежать:

$ /usr/local/bin/g++-6 -std=c++11 -fopenmp main.cpp -o main.o
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:4:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:4:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:89:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:89:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:551:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:551:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1432:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1432:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1799:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1799:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1995:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:1995:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2033:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2033:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2425:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2425:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2559:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2559:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2597:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2597:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2672:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2672:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2837:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2837:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2962:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:2962:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3139:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3139:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3442:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3442:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3588:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3588:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3630:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:3630:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:5253:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:5253:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:5452:11: warning: section "__textcoal_nt" is deprecated
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
/var/folders/jr/30r6h4cj4tl48q_cg9bt5f5h0000gn/T//ccq73Zfg.s:5452:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~

person sap    schedule 11.10.2016    source источник


Ответы (2)


Обновленный ответ

После моего первоначального ответа ниже ситуация улучшилась, и вы можете легко использовать OpenMP с компилятором clang++ - ура!

Для этого сначала установите brew install libomp с помощью homebrew:

brew install libomp

Затем при использовании clang++ используйте эти флаги:

clang++ -Xpreprocessor -fopenmp main.cpp -o main -lomp 

Исходный ответ

Если вы хотите скомпилировать код OpenMP C ++ 11 в OSX, проще всего использовать gcc, который можно установить через homebrew.

Сначала проверьте доступные варианты:

brew options gcc

Пример вывода

--with-all-languages
    Enable all compilers and languages, except Ada
--with-java
    Build the gcj compiler
--with-jit
    Build the jit compiler
--with-nls
    Build with native language support (localization)
--without-fortran
    Build without the gfortran compiler
--without-multilib
    Build without multilib support
--HEAD
    Install HEAD version

Итак, я подозреваю, вы хотите:

brew install gcc --without-multilib --without-fortran

После того, как вы его установили, убедитесь, что вы используете версию homebrew, а не ту, которую поставляет Apple. Вы должны знать, что homebrew устанавливает все в /usr/local/bin и что компилятор C ++ - g++-6. Итак, вам нужно либо скомпилировать:

/usr/local/bin/g++-6 -std=c++11 -fopenmp main.cpp -o main

или настройте PATH в своем профиле входа:

export PATH=/usr/local/bin:$PATH

тогда вы можете просто сделать:

g++-6 -std=c++11 -fopenmp ...

Обратите внимание, что если вы выберете вторую опцию выше (то есть опцию export PATH=...), вам нужно будет либо также ввести команду export в текущем сеансе один раз, чтобы активировать ее, либо выйти из системы и снова войти в систему, поскольку команды вашего профиля выполняются только в авторизоваться.

AFAIK, нет необходимости явно устанавливать libiomp - не уверен, зачем вы это сделали.

person Mark Setchell    schedule 11.10.2016
comment
Марк, спасибо! это сработало. Я получаю несколько предупреждений, которые я опубликовал выше, не могли бы вы посоветовать и по ним. - person sap; 12.10.2016
comment
Думаю, это какая-то чушь, связанная с вашими предыдущими неудачными попытками, поскольку я никогда этого не видел. Я бы попробовал brew rm libiomp --force, перестроил ваш код и попробовал еще раз. Если это не удастся, я попробую brew rm gcc --force, а затем снова установлю gcc в соответствии с моим ответом выше. - person Mark Setchell; 12.10.2016
comment
Спасибо, Марк, подойдет. - person sap; 12.10.2016
comment
Текущие параметры, предоставленные brew options gcc, не включают --without-multilib или --without-fortran - person Omar Haque; 09.06.2018
comment
@OmarHaque Спасибо, что указали на это - я обновил свой ответ. - person Mark Setchell; 09.06.2018
comment
откройте ~ / .bash_profile в macosx и запишите export PATH = ~ / usr / local / bin: $ PATH, таким образом он будет сохранен навсегда. g ++ - 8 urfile.cpp -fopenmp - person Lucky; 30.10.2018

Clang, поставляемый с XCode, не поддерживает OpenMP, в отличие от llvm.org. Существуют инструкции по его установке.

По умолчанию в OSX GCC - это просто символическая ссылка на Clang (согласно комментарию к Компилируйте программы OpenMP с помощью компилятора gcc в OS X Yosemite). Вы можете установить настоящий GCC из Homebrew, который определенно поддерживает OpenMP.

person syazdani    schedule 11.10.2016
comment
Спасибо за ответ, я обновил свой исходный пост с ошибками, которые возникают при попытке установить libiomp. - person sap; 11.10.2016
comment
Вам больше не нужно явно устанавливать libiomp. Действительно, тот факт, что вы называете его libiomp, показывает, что вы используете старую версию, поскольку в последних выпусках LLVM (где OpenMP включен по умолчанию) библиотека называется libomp. - person Jim Cownie; 12.10.2016