66
private(список) – задаёт список переменных,
для которых
порождается
локальная копия в каждой нити; начальное значение
локальных копий переменных из списка не определено.
firstprivate(список) – задаёт список переменных, для которых
порождается локальная копия в каждой нити; локальные копии
переменных инициализируются значениями этих переменных в нити-
мастере.
shared(список) – задаёт список переменных, общих для всех нитей.
Пример 3.13.
struct node
{
struct node *left;
struct node *right;
};
extern void process(struct node *);
void traverse( struct node *p )
{
if (p->left)
#pragma omp task
traverse(p->left);
if (p->right)
#pragma omp task
traverse(p->right);
process(p);
}
Следующий пример показывает как пройти древовидную структуру
используя
директиву task. Функция траверс (
traverse) должна быть
вызвана из параллельной области для различных указанных задач,
которые будут выполняться параллельно. Задачи выполняются не в
указанном порядке, поскольку здесь не
используются директивы
синхронизации. Таким образом, предположение, что обход будет сделан в
том же порядке, что и в последовательном коде, является неверным.
Для гарантированного завершения в точке вызова всех запущенных
задач используется директива
taskwait.
#pragma omp taskwait
67
Нить, выполнившая данную директиву, приостанавливается до тех
пор, пока не будут завершены все ранее
запущенные данной нитью
независимые задачи.
Директива
taskyield указывает, что текущая задача может быть
приостановлена в пользу выполнения других задач.
#pragma omp taskyield
Достарыңызбен бөлісу: