Как я могу условно завершить параллельный регион в OpenMP? - PullRequest
7 голосов
/ 13 декабря 2011

У меня есть программа OpenMP с C ++.Есть параллельные области, которые содержат #pragma omp task внутри параллельной области.Теперь я хотел бы знать, как завершить параллельную область в зависимости от условия, которому удовлетворяет любой из запущенных потоков.

#pragma omp parallel
{
 #pragma omp task
 {
   //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region)
 }

}

1 Ответ

6 голосов
/ 21 декабря 2011

Нельзя преждевременно завершить параллельную конструкцию.OpenMP не имеет никакой конструкции для этого, и он указывает, что у параллельных областей может быть только одна точка выхода (поэтому нет разветвления за пределы области ...).

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

Может быть возможнонаписать системный код, который приостанавливает другие потоки и устанавливает их в конец блока (например, манипулирует указателями стека и инструкций ...), но это не кажется очень целесообразным (то есть это, вероятно, очень хрупко).

Если вы расскажете нам немного больше о том, что вы пытаетесь сделать (и зачем вам это нужно), вам может быть легче помочь вам (например, предложив дизайн, который не нужно делатьэто).

...