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 2010 Express. Однако, я её пока не испытывал.
Visual Studio Express — это бесплатная урезанная версия Visual Studio. Нас будет интересовать версия 2008 года. Скачать её можно отсюда: http://www.microsoft.com/exPress/download/. Естественно, программировать будем на C++, поэтому выбирайте Visual C++ 2008.
Программа установки будет загружать данные из Интернета (примерно 100 мегабайт), поэтому вы можете сэкономить немного трафика, отключив установку Microsoft Silverlight и Microsoft SQL Server, если они вам не требуются.
Со времени написания этой статьи вышел новый SDK: Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1. К сожалению, я его не испытывал. Все существующие SDK перечислены на этой странице.
После установки 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»:
Нажмите кнопку «OK», появится окно настройки будущего проекта. Выберите вкладку «Application Settings», и включите галку «Empty project»:
По нажатию кнопки «Finish» проект будет создан. Никаких видимых изменений в главном окне Visual Studio не произойдёт. Только имя проекта в заголовке окна как бы говорит нам о том, что мы работаем с проектом.
Теперь нажмите Project → Add New Item, появится окно добавления элементов в проект. Добавьте .cpp-файл в проект:
После этого вам будет предоставлено окно для ввода исходного кода программы. Будем выполнять тесты на следующем коде, проверяющем различные аспекты функционирования OpenMP:
#include <omp.h>
using namespace std;
int main(int argc, char **argv)
{
int test( 999 );
omp_set_num_threads( 2 );
#pragma omp parallel reduction(+:test)
{
#pragma omp critical
cout << "test = " << test << endl;
}
return EXIT_SUCCESS;
}
Листинг 1. Простейшая программа, использующая OpenMP
Запустите программу, нажав Debug → Start Without Debugging. Если всё было сделано правильно, программа откомпилируется (если спросит вас, компилировать ли, нажмите «Yes»), затем запустится и выведет test = 999:
«Как же так?! — скажете вы — Ведь программа должна была вывести ноль, причём дважды!». Дело в том, что OpenMP ещё не включен, и поэтому соответствующие директивы были проигнорированы компилятором.
Для включения OpenMP нажмите Project → OMP Properties (OMP — имя проекта из моих примеров). Слева вверху появившегося окна выберите «All Configurations» и в разделе Configuration Properties → C/C++ → Language включите «OpenMP Support»:
После этого снова запустите программу, нажав Debug → Start Without Debugging. На этот раз программа выведет test = 0 дважды:
Ура! 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 включим его в нашу программу следующим образом, чтобы он не догадался о включённом режиме отладки:
#ifdef _DEBUG
#undef _DEBUG
#include <omp.h>
#define _DEBUG
#else
#include <omp.h>
#endif
using namespace std;
int main(int argc, char **argv)
{
int test( 999 );
omp_set_num_threads( 2 );
#pragma omp parallel reduction(+:test)
{
#pragma omp critical
cout << "test = " << test << endl;
}
return EXIT_SUCCESS;
}
Листинг 2. Включаем omp.h «хитрым» способом
Приведённого действия не достаточно для того, чтобы всё работало (пока мы исправили лишь манифест, встраиваемый в программу). Дело в том, что Visual Studio в режиме отладки по прежнему автоматически (из-за включённого OpenMP) прилинковывает vcompd.lib, требующую vcomp90d.dll. Чтобы это исправить, снова зайдите в настройки проекта (Project → OMP Properties), выберите на этот раз Configuration: «Debug». В разделе Configuration Properties → Linker → Input укажите, что vcompd.lib прилинковывать не нужно, а vcompd.lib — нужно:
Проверим теперь, работает ли отладка, и действительно ли программа работает параллельно. Поставьте точку останова на строке с выводом значения переменной. Для этого нажмите левой кнопкой мыши не серую полоску слева от исходного кода:

Рисунок 10. Точка останова
После этого запустите программу в режиме отладки: Debug → Start Debugging (не забудьте вернуть текущую конфигурацию «Debug», см. рисунок 8). Программа запустится — и сразу же остановится на точке останова. Во вкладке «Threads» мы видим, что программа действительно работает, используя два потока:
P.S.
Если вы не знаете, как создавать параллельные программы при помощи OpenMP, советую прочесть спецификацию, там всё подробно описано: http://www.openmp.org/mp-documents/spec30.pdf.














26 отзывов на запись «OpenMP и Visual Studio»
Автор: Артем. Дата: 30-го апреля 2009 г. Время: 08:12.
Спасибо, очень полезная статья.
Автор: Юлия. Дата: 1-го мая 2009 г. Время: 23:45.
Огромное Вам спасибо! Все «по полочкам» и очень доходчиво для новичка!
Автор: Сергей. Дата: 7-го июля 2009 г. Время: 08:25.
Большое спасибо за статью! Очень помогла.
Автор: Владимир. Дата: 22-го сентября 2009 г. Время: 21:34.
Спасибо бооооольшое. Статья действительно очень помогла.
Автор: i16stealth. Дата: 23-го октября 2009 г. Время: 13:10.
Спасибо! Статья для меня очень актуальная
Автор: di. Дата: 9-го декабря 2009 г. Время: 07:15.
Прикол в том что в в SDK нету omp.h именно в в этой, фиг знает где
Автор: di. Дата: 9-го декабря 2009 г. Время: 07:18.
Пардон я использую SDK for Windows 7 and Net 3.5sp1, там нету его
Автор: Антон. Дата: 9-го декабря 2009 г. Время: 11:10.
Так
omp.hдолжен быть в самой Visual Studio ещё до установки SDK.Автор: Володя. Дата: 14-го декабря 2009 г. Время: 20:44.
СПАСИБО!!!!
Автор: play_bot. Дата: 26-го декабря 2009 г. Время: 20:07.
Спасибо большое. Полезная статья для тех, кто только начинает программить!
Автор: Alex. Дата: 17-го января 2010 г. Время: 00:53.
Спасибо огромное за статью
Мне нужно паралельное програмирование на Matlab или Fortran. Не могли бы описать как это сделать.
За ранее огромное спасибо
Автор: Антон. Дата: 17-го января 2010 г. Время: 15:09.
К сожалению, я мало знаком с Matlab, и отрицательно отношусь к Фортрану.
Автор: Андрей. Дата: 5-го февраля 2010 г. Время: 08:36.
Большое спасибо, без Вас бы не разобрался…
Автор: Константин. Дата: 18-го февраля 2010 г. Время: 18:36.
А Вы не могли бы подсказать где можно скачать OpenMP для Windows?
Автор: Антон. Дата: 18-го февраля 2010 г. Время: 22:23.
OpenMP — это не какая-то программа, которую можно «скачать». Это — интерфейс (набор функций и директив компилятора), который позволяет описать параллелизм вашей программы. OpenMP — эта та «фишка», которая поддерживается или не поддерживается вашим компилятором.
Автор: Константин. Дата: 19-го февраля 2010 г. Время: 01:14.
Прочитал статью до конца, всё понял. Спасибо.
Автор: i16stealth. Дата: 14-го апреля 2010 г. Время: 09:56.
Сейчас попробовал совершить указанные действия по настройке Visual Studio Express, пишет «Программа не может быть выполнена»
Автор: Vlad. Дата: 22-го апреля 2010 г. Время: 22:43.
Спасибо за статью. Проверил работу описанной схемы с новым SDK (Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1), в Release проблем нет. Могу подтвердить, что до установки SDK хедера omp.h в include не было, однако после установки он появился.
Автор: Денис. Дата: 31-го октября 2010 г. Время: 20:00.
very good
Автор: Михаил. Дата: 22-го ноября 2010 г. Время: 09:44.
Прекрасная статья. Спасибо автору.
Автор: Татьяна. Дата: 3-го декабря 2010 г. Время: 00:33.
Большое спасибо за статью! очень помогла!
Автор: Валерий. Дата: 16-го декабря 2010 г. Время: 03:43.
Огроменное спасибо!
Автор: Павел. Дата: 19-го марта 2011 г. Время: 14:04.
Спасибо Большое. Очень хорошо всё описано, мне помогло. Ещё раз спасибо!!!!
Автор: littleleshy. Дата: 10-го апреля 2011 г. Время: 13:53.
А можно ли OpenMP «прикрутить» к Code::Blocks?
Автор: Ramses. Дата: 3-го мая 2011 г. Время: 16:27.
Спасибо, Антон — понятная и полезная статья. Очень помогла мне.
Автор: Kozlosoft. Дата: 7-го мая 2011 г. Время: 22:24.
респект тебе, брат. таких как ты мало. вокруг нас пиздешь ебаный. только вместе все и делаем. молодец.