Я думаю о дизайне, в котором пул потоков будет выполнять блоки кода, которые могут содержать операторы OpenMP (в основном параллельно). (Аналогично: Как справиться с конфликтом пула потоков OpenMP Наверное). Мой вопрос заключается в том, вызовет ли это проблемы или приведет к плохой производительности, если параллельная область OpenMP каждый раз выполняется другим потоком.
изменить:
Целью будет Linux (gcc) и Windows (msvc).
Я проверю его, когда будет готов мой первый прототип (на который повлияют ответы, которые я получу здесь).
Вот простой пример:
class Task
{
public:
void doTask()
{
#pragma omp parallel
{
// do work in parallel
}
}
};
Теперь представьте, что вы создаете экземпляр Task
и передаете его пулу потоков (thread-0,..., thread-n). Один поток выполняет doTask()
. Позже вы снова передаете тот же объект Task в пул потоков, и снова ... . Таким образом, doTask()
(и параллельный раздел) будут выполняться разными потоками. Интересно, эффективно ли это обрабатывается OpenMP (например, потоки для раздела не воссоздаются каждый раз).