- OpenMP и Visual Studio
- OpenMP и Visual Studio Express
- Использование OpenMP в Visual Studio
- Отладка OpenMP-программы в Visual Studio Express
- Настройка OpenMP в CLion и пример программы
- Что такое OpenMP
- Настройка OpenMP в CLion
- Пример программы с MPI + OpenMP
- Заключение
- Getting started with openMP. install on windows
- Instructions on how to run MPI, OpenMP and CUDA programs
- Sachin Kumawat and Norm Matloff
- Your Laptop
- Details
- Unix-family systems
- Windows
- Set Up Remote Authentication:
- Compiling MPICH2 Program:
- Running MPICH2 application:
- OpenMP for Windows:
- OpenMP for Mac OS X:
- CUDA for Windows:
OpenMP и Visual Studio
OpenMP позволяет легко создавать параллельные программы для систем с общей памятью (многоядерных и многопроцессорных). В этой статье я расскажу о том, как включить OpenMP в самой распространённой среде программирования – Visual Studio. Согласно официальной версии Microsoft, OpenMP поддерживается только в версиях Professional среды разработки Visual Studio 2005/2008/2010. Однако бесплатная Visual Studio Express обладает тем же компилятором, что и версия Professional. Поэтому после небольшой «доработки напильником» параллельные OpenMP-программы будут компилироваться и, главное, работать даже в Visual Studio Express.
OpenMP от Microsoft реализован посредством следующих компонентов:
- компилятор C++, входящий в состав Visual Studio;
- заголовочный файл omp.h;
- библиотеки стадии компиляции: vcomp.lib и vcompd.lib (последняя используется для отладки);
- библиотеки времени выполнения: vcomp90.dll и vcomp90d.dll. Цифры в названии могут различаться: в Visual Studio 2005 вместо 90 стоят цифры 80.
В бесплатной Visual Studio Express перечисленные библиотеки отсутствуют.
OpenMP и Visual Studio Express
Если вы хотите создавать параллельные OpenMP-программы под Windows, то самый удобный способ – это воспользоваться Visual Studio 2005/2008/2010 Professional. Напоминаю, что она бесплатна для студентов и аспирантов. Кроме того, вы можете купить Visual Studio Professional за $600 (конечно, существует ещё и третий вариант, но мы о нём не будем говорить).
Если на вашем компьютере установлена версия Professional – переходите к следующему разделу статьи. В этом разделе рассмотрим случай, когда по каким-либо причинам вы вынуждены использовать Visual Studio Express.
Visual Studio Express – это бесплатная урезанная версия Visual Studio. Нас будет интересовать версия 2008 года. Скачать её можно отсюда: http://www.microsoft.com/exPress/download/. Естественно, программировать будем на C++, поэтому выбирайте Visual C++ 2008.
Программа установки будет загружать данные из Интернета (примерно 100 мегабайт), поэтому вы можете сэкономить немного трафика, отключив установку Microsoft Silverlight и Microsoft SQL Server, если они вам не требуются.
После установки Visual Studio Express нам понадобится добавить в неё OpenMP-компоненты. Легальный бесплатный способ сделать это – установить Windows SDK for Windows Server 2008 and .NET Framework 3.5. Во время установки этого пакета программ будет произведено обновление Visual Studio. Процесс обновления не смотрит, какая именно версия Visual Studio у вас установлена (Express или Professional), поэтому во время установки будут «случайно» добавлены недостающие компоненты.
Так как мы ставим Windows SDK только ради OpenMP, то нам не нужен тот гигабайт документации, который идёт в комплекте. Рекомендую оставить только следующие элементы:
Рисунок 1. Необходимые нам компоненты SDK
К сожалению, в состав SDK не входит библиотека vcomp90d.dll, поэтому на данный момент в Visual Studio Express вы сможете запускать только OpenMP-программы, откомпилированные в режиме Release. Я нашёл способ обойти и это ограничение, об этом читайте далее (раздел «Отладка OpenMP-программы в Visual Studio Express»).
Использование OpenMP в Visual Studio
После того, как вы выполнили шаги, описанные в предыдущем разделе, уже не важно, какой версией Visual Studio вы пользуетесь. Покажу шаг за шагом, как создать проект с поддержкой OpenMP в этой среде разработки. Прежде всего, нужно запустить Visual Studio, и выбрать File→New→Project. Появится окно создания проекта. Выберите тип проекта «Win32», шаблон – «Win32 Console Application». Введите осмысленное имя проекта, выберите папку для хранения проекта, уберите галочку «Create directory for solution»:
Рисунок 2. Окно создания проекта
Нажмите кнопку «OK», появится окно настройки будущего проекта. Выберите вкладку «Application Settings», и включите галку «Empty project»:
Рисунок 3. Окно настройки будущего проекта
По нажатию кнопки «Finish» проект будет создан. Никаких видимых изменений в главном окне Visual Studio не произойдёт. Только имя проекта в заголовке окна как бы говорит нам о том, что мы работаем с проектом.
Теперь нажмите Project→Add New Item, появится окно добавления элементов в проект. Добавьте .cpp-файл в проект:
Рисунок 4. Окно добавления элементов в проект
После этого вам будет предоставлено окно для ввода исходного кода программы. Будем выполнять тесты на следующем коде, проверяющем различные аспекты функционирования OpenMP:
Листинг 1. Простейшая программа, использующая OpenMP
Запустите программу, нажав Debug→Start Without Debugging. Если всё было сделано правильно, программа откомпилируется (если спросит вас, компилировать ли, нажмите «Yes»), затем запустится и выведет test = 999:
Рисунок 5. Результат работы программы из листинга 1
«Как же так?! – скажете вы – Ведь программа должна была вывести ноль, причём дважды!». Дело в том, что OpenMP ещё не включен, и поэтому соответствующие директивы были проигнорированы компилятором.
Для включения OpenMP нажмите Project→OMP Properties (OMP – имя проекта из моих примеров). Слева вверху появившегося окна выберите «All Configurations» и в разделе Configuration Properties→C/C++→Language включите «OpenMP Support»:
Рисунок 6. Включаем OpenMP в свойствах проекта
После этого снова запустите программу, нажав Debug→Start Without Debugging. На этот раз программа выведет test = 0 дважды:
Рисунок 7. Результат работы программы из листинга 1 с включённым OpenMP
Ура! OpenMP работает.
Примечание. Если вы используете Visual Studio Express, то выберите текущую конфигурацию «Release», иначе работать не будет (читайте далее):
Рисунок 8. Выбор текущей конфигурации
Отладка OpenMP-программы в Visual Studio Express
Как было сказано ранее, даже после установки Windows SDK у нас не будет в наличии необходимой для отладки библиотеки vcomp90d.dll, поэтому мы пока не можем отлаживать OpenMP программу в Visual Studio Express. Простое копирование имеющейся библиотеки vcomp90.dll и переименование её в vcomp90d.dll не сработает, ибо не совпадёт контрольная сумма и версия, указанные во встраиваемом в exe-файл манифесте. Поэтому будем «копать» с противоположной стороны.
При компиляции в конфигурации «Debug» («Отладка»), заголовочный файл omp.h требует библиотеку vcompd.lib (она у нас имеется), которая, в свою очередь, требует vcomp90d.dll (отсутствует). Лицензия не позволяет нам использовать в приложениях модифицированные заголовочные файлы от Microsoft, поэтому вместо модификации omp.h включим его в нашу программу следующим образом, чтобы он не догадался о включённом режиме отладки:
Листинг 2. Включаем omp.h «хитрым» способом
Приведённого действия не достаточно для того, чтобы всё работало (пока мы исправили лишь манифест, встраиваемый в программу). Дело в том, что Visual Studio в режиме отладки по прежнему автоматически (из-за включённого OpenMP) прилинковывает vcompd.lib, требующую vcomp90d.dll. Чтобы это исправить, снова зайдите в настройки проекта (Project→OMP Properties), выберите на этот раз Configuration: «Debug». В разделе Configuration Properties→Linker→Input укажите, что vcompd.lib прилинковывать не нужно, а vcompd.lib – нужно:
Рисунок 9. Заменяем библиотеку в свойствах проекта
Проверим теперь, работает ли отладка, и действительно ли программа работает параллельно. Поставьте точку останова на строке с выводом значения переменной. Для этого нажмите левой кнопкой мыши не серую полоску слева от исходного кода:
Рисунок 10. Точка останова
После этого запустите программу в режиме отладки: Debug→Start Debugging (не забудьте вернуть текущую конфигурацию «Debug», см. рисунок 8). Программа запустится – и сразу же остановится на точке останова. Во вкладке «Threads» мы видим, что программа действительно работает, используя два потока:
Рисунок 11. Отладка OpenMP-программы в Visual Studio Express
Настройка 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. А на сегодня у меня все, спасибо за внимание!
Getting started with openMP. install on windows
Posted by: admin February 27, 2018 Leave a comment
I want to write parallel program in C++ using OpenMP, so I am getting started with OpenMP.
On the other words I am a beginner and I need good OpenMP guide telling how to install it.
Does someone know how to install OpenMP on Windows, then compile and run the program?
OpenMP is not something that you install. It comes with your compiler. You just need a decent compiler that supports OpenMP and you need to know how to enable OpenMP support since it is usually disabled by default.
The standard compiler for Windows comes from Microsoft and it is the Microsoft Visual C/C++ compiler from Visual Studio. Unfortunately its OpenMP support is a bit outdated – even the latest and greatest Visual Studio only supports OpenMP 2.0 (an outdated standard version from 2002). See here for more information on how to use OpenMP in Visual Studio. There are other compilers available as well – both Intel C/C++ Compiler (commercial license required) and GCC (freely available) support newer OpenMP versions and other compilers are available too.
You can start learning OpenMP by visiting the OpenMP web site here. Also there is a great tutorial on OpenMP from Lawrence Livermore National Laboratory available here.
So here is what I did to finally get OpenMP working on my Windows 10 PC:
- Get MinGW – Download and grab what you need to get the basic gcc compiler and the g++ pakage (its really easy to do). You can always run g++ -v to make sure it is up and running
- Run mingw-get upgrade —recursive «gcc This is the “Fun” part. Because at this time there was no libgomp library supported in their 4.9.* version my gcc wasn’t able to recognize the last support version was 4.7.2 so with this I finally was able to run my openMP
Instructions on how to run MPI, OpenMP and CUDA programs
Sachin Kumawat and Norm Matloff
This is a quick overview on running parallel applications with MPI, OpenMP and CUDA. The recommended platform is Unix (includes Linux and Mac OS X) and useful (but untested!) links are accordingly provided for Windows Tools as well. These instruction should be followed to gain familiarity with the tools before starting with actual assignments and taking quizzes.
CRUCIAL NOTE: When you take the quizzes, the various executables, gcc, mpicc, mpiexec, R an python must be in your search path, as the OMSI script will invoke them. A similar statement holds for library paths. Thus it is absolutely essentially that you do a dry run of OMSI before the first quiz.
Both MPI (mpicc, mpiexec) and CUDA (nvcc) toolchains are installed on CSIF machines.
Your Laptop
For our quizzes, you will need gcc, MPI and R for running code, and Python for running our OMSI quiz tool. CUDA for quizzes will just be «pencil and paper» style, no actual compiling/running.
As noted, your version of gcc must be OpenMP-capable. To test that, download omp_hello.c, compile and run:
This will probably fail on a Mac; see below for the remedy.
For the programming assignments, you will also need gcc, MPI and R.
If you have a CUDA-compatible video card, you may install CUDA but be prepared for some obstacles to resolve. Installation can be performed by following instructions from CUDA Toolkit’s homepage. The setup is rather involved but majority of the issues are discussed here.
Installation of OpenMP capable C/C++ compiler and MPI tools
Details
Unix-family systems
Windows
On windows, a version of MPICH called MSMPI can be used along with Visual Studio. Download directly from Microsoft’s Website. Compilation and launch instructions are provided here.
Set Up Remote Authentication:
MPI implementations work by invoking programs on other nodes via ssh or equivalent daemon. Therefore before you can run MPI programs, it is required to once setup passwordless login from one MPI machine to another. To set up passwordless login on CSIF (or any) systems, check FAQ 7.9 and 7.10 of csif-general-faq.
Compiling MPICH2 Program:
To compile a MPI program written in C, type:
For example, for a program PrimePipe.c, make an executable prp this way:
(You may need to specify the full path to prp.)
(If you wish to use C++, use mpicxx instead of mpicc.)
Running MPICH2 application:
Set up a hosts file, listing which machines you wish your MPI app to run on, e.g. hosts3:
Run, say for the above executable named prp on the above hosts file, by typing
where 100 and 0 are the command-line arguments to prp.
The GNU gcc/g++ compilers are capable of running programs with OpenMP directives right out of the box. Therefore no installation/configuration is required for Linux systems (except for OS X, see below). To enable OpenMP support for a program hello_openmp.c, simply compile with the flag -fopenmp as:
OpenMP for Windows:
Visual Studio support for OpenMP is outdated, hence it is recommended to utilize GCC functionality on Windows by installing either Cygwin or MinGW. For Visual Studio, instructions to enable OpenMP support are provided here.
OpenMP for Mac OS X:
The default clang compiler on OS X does not support OpenMP. Since gcc on OS X is just a symbolic link to clang, using the default gcc/g++ will not work either. We need to install the latest homebrew version of gcc (e.g. v6.x) and add its location to the PATH environment variable: The OpenMP program can then be compiled with:
Note that you will need to alias gcc to gcc-6.
The install took 85 minutes when I tried it. Note that it will install in /usr/local/Cellar. Also, I found that I also needed to make sure that /usr/bin/as is ahead of /opt/local/bin in PATH.
(Use g++/g++-6 for C++ applications.)
To run an OpenMP application, first specify the number of threads using OMP_NUM_THREADS enviroment variable. For example, to launch 8 threads, type: under tcsh, similarly for bash. If OMP_NUM_THREADS is not set, by default as many threads as available cores are launched. Now simply run the executable to run the application:
CUDA is installed on CSIF systems at /usr/local/cuda-8.0 and you can obtain details about the installed GPU card on a particular system by typing nvidia-smi on terminal. CUDA is compiled by invoking nvcc compiler. It links with all CUDA libraries and also calls gcc to link with the C/C++ runtime libraries. A CUDA program hello_cuda.cu, which contains both host and device code, can simply be compilled and run as:
CUDA for Windows:
Visial Studio provides support to directly compile and run CUDA applications. Instructions for installation and sample program execution can be found here.