- •Оглавление
- •Директивы
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Примеры
- •Пример
- •Примеры
- •Примеры
- •Примеры
- •Синхронизация
- •Синхронизация
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пирмер
- •Пример условной компиляции
- •Вопросы
- •Пример условной компиляции
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Терминология
- •Конец
Примеры
Следующий цикл не может работать правильно, поскольку переменная temp является общей. Эта переменная должна быть индивидуальной.
#pragma omp parallel for for{ (i=0; i < 100; i++) temp = array[i];
} array[i] = do_something(temp);
47
Примеры
// This works. The variable temp is now private
#pragma omp parallel for for (i=0; i < 100; i++)
{
int temp; // variables declared within a parallel construct are, by definition, private
temp = array[i];
array[i] = do_something(temp);
} |
48 |
|
Примеры
// This also works. The variable temp is declared private
#pragma omp parallel for private(temp) for (i=0; i < 100; i++)
{
temp = array[i];
array[i] = do_something(temp);
}
49
ОсновыOpenMP
Каждый раз, когда используется OpenMP для распараллеливания цикла, следует тщательно изучить все обращения к памяти, включая обращения, выполняемые вызываемыми функциями.
50
ОсновыOpenMP
Переменные, объявленные в директиве parallel, определяются как индивидуальные, за исключением того случая, когда они объявляются с описателем static, поскольку статические переменные не размещаются в стек.
51
ОсновыOpenMP
Циклы, суммирующиезначения, широко распространены, и в OpenMP имеется специальное выражение для работы с ними. Рассмотрим следующий цикл, в котором вычисляется суммамассивацелых чисел.
52