Конструкции OpenMP всегда будут связываться с самой внутренней содержащей конструкцией, даже если она не активна.Поэтому я не думаю, что это возможно при сохранении #pragma omp parallel
для обоих путей кода (по крайней мере, с предоставленной информацией о проблеме).
Обратите внимание, что это хорошо, что он ведет себя так, потому чтов противном случае использование условных выражений может легко привести к очень проблематичному (читай глючному) коду.Посмотрите на следующий пример:
void func(void* data, int size)
{
#pragma omp parallel if(size > 1024)
{
//do some work
#pragma omp barrier
//do some more work
}
}
...
#pragma omp parallel
{
//create foo, bar, bar varies massively between different threads (so sometimes bigger, sometimes smaller then 1024
func(foo, bar);
//do more work
}
В общем случае программисту не нужно знать детали реализации вызываемых функций, только их поведение.Поэтому мне действительно не нужно заботиться о том, создает ли func
вложенный раздел parallel
или нет, и при каких именно условиях он создается.Однако, если barrier
будет связываться с внешним parallel
, если внутреннее неактивно, этот код будет содержать ошибки, так как некоторые потоки внешних секций parallel
встречают barrier
, а некоторые нет.Поэтому такие детали остаются скрытыми внутри самого внутреннего, содержащего parallel
, даже если оно не активно.
Лично я никогда не сталкивался с ситуацией, когда я хотел, чтобы он вел себя по-другому (что противоречило бы сокрытию информации и тому подобное), поэтому, возможно, вам следует рассказать нам немного больше о том, что вы пытаетесь достичь, чтобы стать лучшеответы.