Задача OpenMP если или финальная - PullRequest
0 голосов
/ 06 декабря 2018

, если я не хочу создавать больше задач, если (длина массива <100).<code>if(r - l >= 100) или final(r - l < 100) удовлетворяет этому условию?(l = minIndex; r = maxIndex)

1 Ответ

0 голосов
/ 16 января 2019

Они оба работают.Соответствующими частями спецификации являются:

отложенная задача Задача, выполнение которой не откладывается в отношении ее генерирующей области задачи.То есть его область генерирующей задачи приостанавливается до тех пор, пока не будет завершено выполнение отложенной задачи.

включенная задача Задача, выполнение которой последовательно включается в область генерирующей задачи.То есть включенная задача откладывается и немедленно выполняется сталкивающимся потоком.

конечная задача Задача, которая заставляет все ее дочерние задачи стать конечными и включенными задачами.

[...]

Когда в конструкции задачи присутствует предложение if, а выражение условия if оценивается как false, генерируется задача с отложенным вызовом, и поток, с которым сталкиваются, должен приостановить текущую область задачи,выполнение которого не может быть возобновлено до тех пор, пока сгенерированная задача не будет завершена.Использование переменной в выражении предложения if конструкции задачи вызывает неявную ссылку на переменную во всех включающих конструкциях.

Когда в конструкции задачи присутствует конечное предложение, а выражение конечного предложения оценивается как trueСгенерированная задача будет конечной.Все конструкции задач, встречающиеся во время выполнения конечной задачи, будут генерировать конечные и включенные задачи.Обратите внимание, что использование переменной в выражении конечного предложения конструкции задачи вызывает неявную ссылку на переменную во всех вмещающих конструкциях.

----- OpenMP Architecture Review Board.«Интерфейс прикладного программирования OpenMP». Спецификация Версия 4.5, ноябрь 2015 г.

Это означает, что if(false) и final(true) оба сразу выполняют содержимое задачи.Единственное отличие состоит в том, что если внутри вашей задачи есть другая конструкция задачи.

#pragma omp task if(0)
{
     // this task is created and executed normally
     #pragma omp task
     foo();
}
#pragma omp task final(1)
{
     // this task is "included", i.e. executed sequentially and immediately
     #pragma omp task
     foo();
}

Из этой формулировки кажется , что if(false) создаст задачуи немедленно запустите его, в то время как final просто последовательно запустит код, не создавая задачу.Однако я не уверен, что это правда, и что это влияет на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...