- •Оглавление
- •Директивы
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Пример
- •Примеры
- •Примеры
- •Примеры
- •Синхронизация
- •Синхронизация
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пирмер
- •Пример условной компиляции
- •Вопросы
- •Пример условной компиляции
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Конец
Пример
Функцияnum_threads
Явнозадаетколичествопотоков, которыебудутвыполнять параллельнуюобласть
По умолчанию выбирается значение, установленноеспомощьюфункции omp_set_num_threads()
196
Пирмер
Функцияnum_threads
Модифицировавпрограмму,приведенную вышеследующимобразом:
n=omp_get_thread_num();
Присвоение переменной |
«n» числапотоков, входящихв |
текущуюгруппу потоков |
|
#pragma omp parallel num_threads(4), private(n)
Явное заданиепотоков, вданномслучаечетырех,длявыполнения параллельногорегиона
получимвывод:
197
Функциидляработыстаймером
omp_get_wtime — возвращаетв вызвавшемпотоке астрономическое времявсекундах(вещественноечисло двойнойточности — double), прошедшееснекоторого моментав прошлом. Еслинекоторый участок программыокружить вызовамиданной функции,торазность возвращаемых
значенийпокажетвремяработы |
|
данногоучастка. |
198 |
|
Функциидляработыстаймером
omp_get_wtick() — возвращаетв вызвавшемпотоке разрешающую способность таймеравсекундах,то естьточность таймера.
199
Примерыивременныехарактеристики
Вычислениечислаπ
С использованием OpenMP |
Без использования OpenMP |
200
Вычисление числа π
voidexpressPi(){
longlong num_steps=1000000000; doublestep;
clock_tstart,stop; doublex,pi,sum=0.0; inti;
step=1./(double)num_steps; start=clock();
201
Вычисление числа π
#pragmaompparallelforprivate(x) reduction(+:sum)
for(i=0;i<num_steps;i++)
{
x=(i+.5)*step;
sum=sum+4.0/(1.+x*x);
}
pi=sum*step; stop=clock();
Console::WriteLine("ВеличиначислаПи:"+pi+ "\n");
Console::WriteLine("Времявычислений:"+ ((double)(stopstart)/1000.0)+"сек.\n");
} |
202 |
Инструментарийдля OpenMP
203
Инструментарийдля OpenMP
ВключениеподдержкиOpenMP 2.0в
средеVisual Studio 2010
Открыть, еслинеоткрыто, окно «Обозревательрешений»,выбраввменю «Вид»пункт«Обозревательрешений».
204
Инструментарийдля OpenMP
Вокне«Обозревательрешений»щелкнуть правойкнопкоймышипоназванию проектаивыбратьпункт«Свойства».
205
Инструментарийдля OpenMP
206
Инструментарийдля OpenMP
Вверхнейчасти«Страницысвойств» выбратьдлякакой конфигурациии платформыизменятьсвойства.
207
Инструментарийдля OpenMP
Далеевыбратьвдеревесвойств, находящемсяслевойстороны «Страницы свойств»,«Свойстваконфигурации»- «C/C++»- «Язык»ивправомокне установить свойство«ПоддержкаOpen MP»взначение«Да».
208
Инструментарийдля OpenMP
Далеевыбратьвдеревесвойств, находящемсяслевойстороны «Страницы свойств»,«Свойстваконфигурации»- «C/C++»- «Язык»ивправомокне установить свойство«ПоддержкаOpen MP»взначение«Да».
209
Инструментарийдля OpenMP
210
Инструментарийдля OpenMP
#include <omp.h>
Use Intel C++
211
Инструментарийдля OpenMP
Теперьприкомпиляциипроекта выбираемтуконфигурацию,настройки которой необходимы.Для смены конфигурациивыбратьменю «Построение»пункт«Диспетчер конфигурации».
212
Инструментарийдля OpenMP
213
Инструментарийдля OpenMP
Вверхнейчастиокна«Диспетчер конфигураций»выбратьактивную конфигурациюиплатформудлявсех проектов решения.
214
Инструментарийдля OpenMP
илинастроить индивидуальнодля каждого проектаврешении.
215
Инструментарийдля OpenMP
Длятого, чтобыпрагмынебыли проигнорированыпредпроцессором, необходимоподключитьбиблиотеку OpenMP «omp.h»следующейстрокой кода:
#include <omp.h>
216
Инструментарийдля OpenMP
Еслибиблиотеканеподключена,тоне смотря нато,чтовсвойствахпроекта включенаподдержкаOpenMP,прагмы будутпроигнорированыкомпилятором и кодбудетсгенерированкак последовательный.
217
Инструментарийдля OpenMP
Условная компиляция
Стандарт описывает набор директив
(directive), предложений (clause), функций и глобальных переменных библиотеки
OpenMP.
218
Инструментарийдля OpenMP
Условная компиляция
Для определения поддержки и версии OpenMP предпроцессором в библиотеке определен специальный макрос «_OPENMP». Он представляет собой 6- разрядное десятичноечисло, старшие цифры которого год, а младшие месяц релиза данной версии. Например, для
OpenMP2.0 «_OPENMP» примет значение «200203».
219