Я думаю, что проект был пулом потоков, который будет выполнять блоки кода, которые могут содержать инструкции OpenMP (в основном параллельные). (Похоже на: How to deal with OpenMP thread pool contention, я думаю). Мой вопрос в том, что это вызовет проблемы или приведет к плохой производительности, если параллельная область OpenMP будет выполняться по-разному.Код OpenMP, выполняемый в пуле потоков
редактировать:
Target будет Linux (GCC) и Windows (MSVC).
Я буду тестировать его, когда будет выполнен мой первый прототип (на который будут влиять ответы, которые я получаю здесь).
Вот простой пример:
class Task
{
public:
void doTask()
{
#pragma omp parallel
{
// do work in parallel
}
}
};
Теперь представьте, что вы создать экземпляр Task
дать его в пул потоков (токарно-0, ..., токарно-н). Один поток выполняет doTask()
. Позже вы снова возвращаете тот же объект задачи в пул потоков, и снова .... Таким образом, doTask()
(и параллельный раздел) будут выполняться разными потоками. Интересно, эффективно ли это обрабатывается OpenMP (например, потоки для раздела не воссоздаются каждый раз).
На каком компиляторе? –
В моем опыте оптимизации кода есть единственный способ узнать, будет ли что-то улучшаться в производительности: сравните его. Мышление и создание гипотезы, если что-то медленное или нет, полезно только в том случае, если реализация слишком сложна. Создайте реалистичную тестовую демонстрацию и сравните ее. –