Меню

Clion openmp не работает

Настройка OpenMP в CLion и пример программы

Доброго времени суток! Продолжаем рассматривать варианты параллельного исполнения программ. Я уже рассказывал про библиотеку MPI, которая позволяет создавать несколько параллельно исполняемых процессов в системе. Рассказал о базовой установке MPI, интеграции его в CLion и даже поделился своей реализацией алгоритма Флойда-Уоршелла.

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

А в этой статье я расскажу о потоках(Threads). Потоки создаются внутри процесса, они имеют доступ к стеку своего процесса, могут читать и писать в область памяти процесса. Благодаря этому увеличивается эффективность параллельных алгоритмов, уменьшаются затраты ресурсов на пересылку данных. Кроме того, упрощается программирование алгоритмов, проще следить за синхронизацией данных и прочее.

Что такое OpenMP

Признанным открытым стандартном параллельного программирования на языках C/C++ и Fortran является OpenMP. Он включает в себя множество директив препроцессора, библиотечных функций и переменных окружения для реализации многопоточных программ. Более подробную информацию вы сможете найти на вики и прочих источниках, а я перейду непосредственно к настройке.

Настройка OpenMP в CLion

По аналогии с настройкой MPI, дело решается всего одной строкой в CMakeLists.txt . Дело в том, что специально устанавливать OpenMP не нужно, он по умолчанию поддерживается очень многими компиляторами, в том числе и gcc версии 4.7 и выше. На моей Ubuntu 16.04 из коробки установлен gcc версии 5.4.0, поэтому никакой головной боли я не испытал. Поэтому смело обновляйте gcc и в бой. Гордым обладателям Visual Studio стоит покопаться в настройках проекта и включить поддержку OpenMP.

Дать компилятору понять, что нужно работать с потоками можно флагом -fopenmp. Именно это мы и пропишем в CMakeLists.txt

Мы установили флаг для компилятора, по умолчанию для gcc. С такой же легкостью мы можем скрестить MPI и OpenMP, прописав правила из инструкции, ссылку на которую я давал выше. В итоге у нас получится такая настройка.

Пример программы с MPI + OpenMP

Для демонстрации работы связки MPI и OpenMP я предлагаю написать простейшую программу. Задача: создать два процесса, в каждом по три потока так, чтобы каждый поток выводил свое случайное число. Таким образом мы убедимся, что потоки создаются именно в рамках процесса, и что все потоки имеют доступ к общей памяти процесса.

Заключение

Поздравляю друзья, нам удалось распараллелить еще один «Hello world». Вообще по ощущениям, писать с помощью OpenMP гораздо приятнее. Не нужно париться над пересылками данных, синхронизациями и прочим. Но максимально эффективной все таки является связка MPI+OpenMP. А на сегодня у меня все, спасибо за внимание!

Источник

Clion и OpenMP

Я изучаю параллельные вычисления и начал свой путь с OpenMP и C.

Я настраивал Clion, но безуспешно.

Но я получаю эту ошибку:

В функции main ‘: C: /Users/John/CLionProjects/Parallelexamples/main.c: 6: неопределенная ссылка на omp_get_num_threads ‘ C: /Users/John/CLionProjects/Parallelexamples/main.c: 7: неопределенная ссылка на `omp_get_thread_num ‘ collect2.exe: ошибка: ld вернул 1 статус выхода mingw32-make.exe [2]: * [Parallelexamples.exe] Ошибка 1 CMakeFiles \ Parallelexamples.dir \ build.make: 95: не удалось выполнить рецепт целевого файла Parallelexamples.exe mingw32-make.exe [1]: * [CMakeFiles / Parallelexamples.dir / all] Ошибка 2 CMakeFiles \ Makefile2: 66: не удалось выполнить рецепт целевого файла CMakeFiles / Parallelexamples.dir / all. Makefile: 82: рецепт для цели ‘все’ не удалось mingw32-make.exe: *** [все] Ошибка 2

Я выполнил инструкции и создал свои txt-файлы CMakeLists следующим образом:

Я что-то пропустил?

2 ответа

Прежде всего, поскольку вы используете CMake, воспользуйтесь макросом FindOpenMP : https://cmake.org/cmake/help/latest/module/FindOpenMP.html

Во-вторых, похоже, вы не подключаетесь к библиотеке времени выполнения OpenMP. Вы должны не только передавать флаги компиляции openmp , вы также должны передавать правильный (е) флаг (ы) компоновщика:

Читайте также:  Jbl quantum 300 не работает звук

И как примечание, если вы действительно программируете на C, а не на C ++, вам не понадобится CXX_FLAGS , вы можете просто использовать C_FLAGS

В современном CMake следует использовать импортированные цели OpenMP.

Источник

Tutorial: Configure CLion on Windows

On Windows, configuring CLion requires setting up the environment: Cygwin, MinGW, WSL, or Microsoft Visual C++. You can have several environments installed on your system and create separate CLion toolchains for each of them. As a determining part of a toolchain, the environment provides C and C++ compilers, the make utility, and the debugger (in case of using default tools).

For details on Remote Host toolchains, see Full Remote Mode.

MinGW

MinGW-w64 (64- and 32-bit)

Download and run the MinGW-w64 installer. It provides both 64- and 32-bit options.

In the MinGW-w64 installation wizard, make sure to select the required architecture. Note that the default suggested option is 32-bit.

Once the installation is finished, open CLion and go to File | Settings | Build, Execution, Deployment | Toolchains .

Choose the MinGW toolchain that you want to configure or create a new one using the icon.

CLion will attempt to detect the MinGW installation automatically. Check the detection result in the Environment field, and specify the path manually if required.

Wait until the tools detection finishes.

Select the Debugger : you can use either MinGW-w64 GDB or a custom GDB binary.

Click Apply when all the tools are set correctly.

MinGW (32-bit only)

Although MinGW-w64 provides both 64- and 32-bit options, you can also install MinGW, the 32-bit-only version.

In the MinGW installation wizard, select the following packages from the Basic Setup list: mingw-developer-tool , mingw32-base , mingw32-gcc-g++ , mingw32-msys-base .

When configuring the toolchain, if CLion cannot detect compilers or make , double-check the installed packages in MinGW Installation Manager .

In the Debugger field, you can choose between the bundled GDB, MinGW GDB, or your custom GDB executable.

The recommended option is bundled GDB, since it is guaranteed to include Python support required for CLion data renderers.

Cygwin

Download the Cygwin installer, version 2.8 or later.

Run the installer and select the following packages:

  • gcc-g++
  • make
  • gdb

To select a package, type its name in the Search field and set the version in the New column:

Once the installation is finished, open CLion and go to File | Settings | Build, Execution, Deployment | Toolchains . Choose the toolchain that you want to configure.

Select Cygwin from the Environment list. CLion will attempt to detect the Cygwin installation automatically. Check the detection result, and specify the path manually if required.

Wait until the tools detection finishes, and click Apply .

Windows Subsystem for Linux

You can use WSL, Windows Subsystem for Linux, as your working environment in CLion on Windows 10 (starting the Fall Creators Update version 1709, build 16299.15).

WSL toolchain enables you to build projects using CMake and compilers from Linux and run/debug on WSL without leaving CLion running on your Windows machine.

Refer to our WSL guide for details on setting up WSL on your system and configuring WSL toolchains in CLion.

Microsoft Visual C++

Install Visual Studio 2013, 2015, 2017, or 2019 on your system.

In CLion, go to File | Settings | Build, Execution, Deployment | Toolchains .

Click and select Visual Studio from the list of toolchain templates.

Читайте также:  Не работает пример тнт

Check the Environment field. CLion will attempt to automatically detect the installed Visual Studio distribution. If the detection fails, set the path to Visual Studio manually.

If required, specify the Architecture ( x86 , amd64 , x86_arm , or another), Platform ( store , uwp , onecore , or leave it blank), and Version . To build your project for the selected architecture, CLion will call the script to configure the environment with the specified parameters.

If the version of your compiler toolset is earlier than the version of your Visual Studio installation, pass it in the Version field via the vcvars_ver flag, for example, -vcvars_ver=14.16 .

Wait until the tools detection is finished:

MSVC compiler

CLion supports the Microsoft Visual C++ compiler that ships with Visual Studio 2013, 2015, 2017, and 2019.

Note that msbuild is not supported: CLion runs CMake with the NMAKE generator instead.

For the case when your code includes MSVC extensions, CLion provides the support for:

__uuidof , __forceinline , __unaligned , and __alignof keywords;

pointer type attributes: __ptr32 , __ptr64 , __uptr , __sptr ;

MSVC built-in data types: (unsigned) __int8 , (unsigned) __int16 , (unsigned) __int32 , (unsigned) __int64 , __wchar_t ;

additional format specifiers, such as %I32 and %I64 ;

the clang ‘s -fms-extensions flag.

Clang-cl compiler

As an alternative compiler, you can use clang-cl- the MSVC-compatible compiler driver for Clang. CLion supports clang-cl version 8.0 and later.

Install clang-cl from the LLVM site or along with the Visual Studio tools.

When installed from the LLVM site, the clang-cl binary can be found at the standard location C:\Program Files\LLVM\bin\clang-cl.exe for the 64-bit version or C:\Program Files (x86)\LLVM\bin\clang-cl.exe for the 32-bit version.

In CLion, go to File | Settings | Build, Execution, Deployment | Toolchains and select the Visual Studio toolchain that you want to configure, or create a new one.

Point the C Compiler and C++ Compiler fields to clang-cl.exe . CLion will suggest the paths detected automatically.

Note that currently the -T clangcl options can’t be picked up if the bundled CMake is in use along with the Visual Studio toolchain setup (CPP-18848).

MSVC debugger

The MSVC toolchain debugger is implemented on top of LLDB, and it can work with native visualizers from the Visual Studio installation or from your project.

To enable native visualizers support and set the desired diagnostics level, select the Enable NatVis renderers for LLDB checkbox in Settings | Build, Execution, Deployment | Debugger | Data Views | C/C++ :

CLion automatically generates one-line summaries for all structures not covered by Natvis and highlights them to increase readability. Also, the built-in formatters provide visualization for wide/Unicode strings ( wchar_t , char16_t , char32_t ).

If you have custom native visualizers in your project, CLion will use them as well.

Clang compiler on Windows

With CMake 3.15, it has become possible to use the Clang compiler on Windows with the MinGW-w64/MinGW toolchain.

However, the LLVM Clang for Windows is built using Microsoft Visual Studio, and all the built-in macros and include search paths are set up for use with Visual Studio. So if you take Clang from the LLVM repository, it will not work correctly when configured with the MinGW toolchain. One of the possible workarounds is described below.

Set up the Clang compiler for MinGW

Download the following packages with the pacman tool (use the pacman -S package_name command):

Источник

/openmp (Включить поддержку OpenMP)

Заставляет компилятор обрабатывать #pragma omp директивы для поддержки OpenMP.

Синтаксис

/openmp
/openmp:experimental
/openmp:llvm

Remarks

#pragma omp используется для указания директив и предложений. Если параметр /openmp не указан при компиляции, компилятор игнорирует предложения и директивы OpenMP. Вызовы функций OpenMP обрабатываются компилятором, даже если /openmp не указаны.

Читайте также:  Почему ноут блютуз не работает

Компилятор C++ в настоящее время поддерживает стандарт OpenMP 2,0. однако Visual Studio 2019 теперь также предлагает функции SIMD. Чтобы использовать SIMD, Скомпилируйте с помощью /openmp:experimental параметра. Этот параметр включает как обычные функции OpenMP, так и функции OpenMP SIMD, недоступные при использовании /openmp параметра.

начиная с Visual Studio 2019 версии 16,9 можно использовать экспериментальный /openmp:llvm вариант вместо /openmp для целевой среды выполнения OpenMP LLVM. В настоящее время поддержка в рабочем коде недоступна, так как требуемые библиотеки DLL либомп не являются распространяемыми. Параметр поддерживает те же директивы OpenMP 2,0, что и /openmp . И поддерживают все директивы SIMD, поддерживаемые /openmp:experimental параметром. Он также поддерживает параллельные индексы целых чисел без знака в соответствии со стандартом OpenMP 3,0. Дополнительные сведения см. в разделе Улучшенная поддержка OpenMP для C++ в Visual Studio.

В настоящее время /openmp:llvm параметр работает только в архитектуре x64. Параметр несовместим с /clr или /ZW .

Приложения, скомпилированные с помощью /openmp и, /clr могут выполняться только в одном процессе домена приложения. Несколько доменов приложений не поддерживаются. Это значит, что при запуске конструктора модуля ( .cctor ) он обнаруживает, компилируется ли процесс с помощью /openmp , и если приложение загружается в среду выполнения, не используемую по умолчанию. Дополнительные сведения см. в статьях appdomain , /clr (компиляция среды CLR)и Инициализация смешанных сборок.

При попытке загрузить приложение, скомпилированное с помощью /openmp и, и /clr в домен приложения, не заданный по умолчанию, TypeInitializationException исключение создается вне отладчика, и OpenMPWithMultipleAppdomainsException в отладчике создается исключение.

Эти исключения также могут возникать в следующих ситуациях.

Значение, если приложение компилируется с использованием /clr , но не /openmp и загружается в домен приложения, не заданный по умолчанию, где процесс включает приложение, скомпилированное с помощью /openmp .

При передаче /clr приложения в служебную программу, например regasm.exe, которая загружает целевые сборки в домен приложения, не используемый по умолчанию.

Управление доступом для кода среды CLR не работает в регионах OpenMP. Если атрибут управления доступом для кода CLR применяется за пределами параллельной области, он не будет действовать в параллельной области.

Корпорация Майкрософт не рекомендует создавать /openmp приложения, допускающие частично доверенные вызывающие объекты. Не используйте AllowPartiallyTrustedCallersAttribute или любые атрибуты управления доступом для кода CLR.

Установка данного параметра компилятора в среде разработки Visual Studio

Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

Разверните страницу Свойства > языка C/C++ > язык .

Измените свойство поддержки OpenMP .

Установка данного параметра компилятора программным способом

Пример

В следующем примере показаны некоторые эффекты запуска пула потоков по сравнению с использованием пула потоков после его запуска. При условии, что 64-разрядная, одноядерная, Двухъядерный процессор, пул потоков занимает около 16 мс для запуска. После этого пул потоков будет немного излишним.

При компиляции с помощью /openmp второй вызов test2 никогда не выполняется дольше, чем при компиляции с помощью /openmp- , так как отсутствует запуск пула потоков. В миллионах итераций /openmp версия выполняется быстрее, чем /openmp- версия второго вызова test2. При 25 итерациях обе /openmp- /openmp версии регистрируются меньше, чем степень гранулярности часов.

Если в приложении имеется только один цикл и оно выполняется менее чем на 15 мс (оно корректируется на приблизительную нагрузку на компьютер), /openmp может быть неприемлемо. Если это более высокое значение, можно использовать /openmp .

Источник

Adblock
detector