Обычное правило предпочтения для OpenMP - оценивать OMP_NUM_THREADS
, когда запускается среда выполнения OpenMP и до того, как она создаст первые потоки.Эффект omp_set_num_threads()
зависит от того, где он вызывается.
Если вызов выполняется из последовательной области, то он влияет на параллельную область next , с которой можно столкнуться (если только эта областьиспользует предложение num_threads
для установки другого числа).Если вызов выполняется из параллельной области, то эффект действует только для вызывающего потока и будет влиять на вложенную параллельную область, с которой сталкивается этот поток (опять же, нет условия num_threads
для этой области плюс OMP_NESTED=true
).
Итак, если вы хотите избежать параллелизма для вызываемых функций DLL, вы должны вызывать omp_set_num_threads(1)
перед каждым вызовом функций DLL и восстанавливать предыдущее значение после возврата вызова.