Они оба работают.Соответствующими частями спецификации являются:
отложенная задача Задача, выполнение которой не откладывается в отношении ее генерирующей области задачи.То есть его область генерирующей задачи приостанавливается до тех пор, пока не будет завершено выполнение отложенной задачи.
включенная задача Задача, выполнение которой последовательно включается в область генерирующей задачи.То есть включенная задача откладывается и немедленно выполняется сталкивающимся потоком.
конечная задача Задача, которая заставляет все ее дочерние задачи стать конечными и включенными задачами.
[...]
Когда в конструкции задачи присутствует предложение 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
просто последовательно запустит код, не создавая задачу.Однако я не уверен, что это правда, и что это влияет на производительность.