Как я могу написать коды, которые повторно используют поток на C ++ OpenMP? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть функция f , которую я могу использовать параллельной обработкой. Для этого я использовал openmp. Однако эта функция вызывается много раз, и создается впечатление, что создание потока выполняется при каждом вызове.

Как мы можем повторно использовать поток?

void f(X &src, Y &dest) {
   ... // do processing based on "src"
   #pragma omp parallel for
   for (...) { 

   }
   ...// put output into "dest" 
}

int main() {
    ...
    for(...) { // It is impossible to make this loop processing parallel one.
       f(...);
    }
    ...
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Это только в дополнение к правильному ответу Антона. Если вы действительно обеспокоены этой проблемой, для большинства программ вы можете легко переместить параллельную область наружу и сохранить последовательный последовательный режим работы следующим образом:

void f(X &src, Y &dest) {
   // You can also do simple computations
   // without side effects outside of the single section
   #pragma omp single
   {
   ... // do processing based on "src"
   }
   #pragma omp for // note parallel is missing
   for (...) { 

   }
   #pragma omp critical
   ...// each thread puts its own part of the output into "dest" 
}

int main() {
    ...
    // make sure to declare loop variable locally or explicitly private
    #pragma omp parallel
    for(type variable;...;...) {
       f(...);
    }
    ...
    return 0;
}

Используйте это только в том случае, если вы измерили доказательства того, что вы страдаете от накладных расходов, связанных с открытием параллельных регионов. Возможно, вам придется жонглировать общими переменными или вручную встроить f, потому что все переменные, объявленные в f, будут частными - поэтому то, как это выглядит подробно, зависит от вашего конкретного приложения.

0 голосов
/ 03 мая 2018

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

Можно проверить, что потоки действительно одинаковы, используя локальные потоки. Я бы порекомендовал вам проверить ваше заявление о воссоздании темы. Среда выполнения OpenMP выполняет множество интеллектуальных оптимизаций, помимо очевидной идеи пула потоков, вам просто нужно знать, как правильно ее настроить и контролировать.

Маловероятно, что потоки воссоздаются, но легко увидеть, как потоки могут перейти в спящий режим, когда вы снова вызываете параллельную область, и для их пробуждения требуется значительное время. Вы можете предотвратить переход потоков в спящий режим, используя OMP_WAIT_POLICY=active и / или переменные среды, зависящие от реализации, такие как KMP_BLOCKTIME=infinite (для времени выполнения Intel / LLVM).

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