- •Оглавление
- •Директивы
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Пример
- •Примеры
- •Примеры
- •Примеры
- •Синхронизация
- •Синхронизация
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пирмер
- •Пример условной компиляции
- •Вопросы
- •Пример условной компиляции
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Конец
Директивы
Parallel
#pragmaompparallel
{
cout<<"OpenMPTest"<< endl;
}
33
Базовыеконструкции
ДирективаCоздает параллельныйparallel регион для следующего за ней структурированного блока, например:
#pragmaompparallel[другиедирективы]
структурированныйблок
34
ОсновыOpen MP
Основной структуройв программе, которуюможно распараллелить – это циклы.
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
переменная цикла должна иметь тип signed integer. Беззнаковые целые числа, такие как DWORD, работать не будут.
35
ОсновыOpen MP
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
Операция сравнения должна иметь следующий формат:
переменная_цикла <, <=, >, >= инвариант_цикла_целого_типа
36
ОсновыOpen MP
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
Третье выражение (или инкрементная часть цикла for) должно являться либо целочисленным сложением, либо целочисленным вычитанием и должно практически совпадать со значением инварианта цикла.
37
ОсновыOpen MP
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
Если используется операция сравнения < или <=, переменная цикла должна увеличиваться при каждой итерации, а при использовании операции > или >= переменная цикла должна уменьшаться.
38
ОсновыOpen MP
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
цикл должен являться базовым блоком. Это означает, что не разрешены переходы из цикла, за исключением оператора exit, который завершает работу всего приложения.
39
ОсновыOpen MP
В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:
если используются операторы goto или break, они должны приводить к переходам внутри цикла, а не вне его. То же самое относится к обработке исключений; исключения должны перехватываться внутри цикла.
40
Обзор технологии OpenMP
Принципы организации параллелизма
#pragma omp parallel for for (i=0; i < numPixels; i++)
{
pGrayScaleBitmap[i] = (unsigned BYTE) (pRGBBitmap[i].red * 0.299 + pRGBBitmap[i].green * 0.587 + pRGBBitmap[i].blue * 0.114);
}
/* Преобразование 32-разрядного пикселя в цветовой модели RGB в 8-разрядный пиксель в модели Grayscale
*/
Обзор технологии OpenMP
Принципы организации параллелизма
#pragma omp parallel for for (i=2; i < 10; i++)
{
factorial[i] = i * factorial[i-1];
}
Управлениеобщимии
индивидуальнымиданными
Практически в каждом цикле (по крайней мере, если это полезный цикл) выполняется чтение данных из памяти и запись в память.
Программист должен указать компилятору, какие участки памяти являются общими для всех потоков, а какие участки должны быть индивидуальными.
43
Управлениеобщимии
индивидуальнымиЕсли память определенад ннымикак общая,
все потоки получаютдоступ к одному и тому же адресу памяти.
Однако если память определена как индивидуальная, создается отдельная копия переменной для каждого потока, чтобы обеспечить индивидуальный доступ.
44
Управлениеобщимии
индивидуальнымиданными
После завершения цикла эти индивидуальные копии уничтожаются.
По умолчанию общими являются все переменные, за исключением переменной цикла, которая является индивидуальной.
45
Управлениеобщимии
индивидуальнымиданными
Память можно объявить как индивидуальную следующими двумя способами.
Объявитьпеременную внутри цикла (внутри директивы OpenMP) без ключевого слова static.
Указать индивидуальное выражение в директиве OpenMP.
46