Н., Пескова Е. Е., Шаманаев П. А. Основы параллельного программирования с использованием технологий mpi и openmp учебное пособие саранск издательство свмо 2013 2



Pdf көрінісі
бет45/53
Дата07.06.2023
өлшемі6.58 Mb.
#474796
1   ...   41   42   43   44   45   46   47   48   ...   53
ParProg MPI OpenMP

 
3.4.4 Задачи 
Директива task применяется для выделения отдельной независимой 
задачи. 
#pragma omp task опция[[[,] опция] ...] 
структурированный блок 
Текущая нить выделяет в качестве задачи ассоциированный с 
директивой блок операторов. Задача может выполняться немедленно 
после создания или быть отложенной на неопределённое время и 
выполняться по частям. Размер таких частей, а также порядок выполнения 
частей разных отложенных задач определяется реализацией [4,5]. 
Рассмотрим возможные опции данной директивы. 
if(условие) – порождение новой задачи только при выполнении 
некоторого условия; если условие не выполняется, то задача будет 
выполнена текущей нитью и немедленно. 
untied – опция означает, что в случае откладывания задача может 
быть продолжена любой нитью из числа выполняющих данную 
параллельную область; если данная опция не указана, то задача может 
быть продолжена только породившей её нитью. 
default(shared | none) – всем переменным в задаче, которым явно не 
назначен класс, будет назначен класс shared; none означает, что всем 
переменным в задаче класс должен быть назначен явно. 


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
 
 


Достарыңызбен бөлісу:
1   ...   41   42   43   44   45   46   47   48   ...   53




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет