2011-01-28 8 views
2

Я думаю, что проект был пулом потоков, который будет выполнять блоки кода, которые могут содержать инструкции 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 (например, потоки для раздела не воссоздаются каждый раз).

+0

На каком компиляторе? –

+2

В моем опыте оптимизации кода есть единственный способ узнать, будет ли что-то улучшаться в производительности: сравните его. Мышление и создание гипотезы, если что-то медленное или нет, полезно только в том случае, если реализация слишком сложна. Создайте реалистичную тестовую демонстрацию и сравните ее. –

ответ

4

Комментарий Vitor's является правильным. Трудно сказать, вызовет ли это проблемы, потому что ответ зависит от многих факторов (например, от расположения данных, от того, как вы обращаетесь к данным, размера кеша, типа процессора, на котором вы работаете, и списка продолжается).

Я могу сказать, что вы можете или не сможете заставить это работать. Спецификация OpenMP - как и большинство других моделей потоковой передачи - ничего не говорит о том, как или если модели будут «хорошо играть вместе». Например, хотя некоторые реализации OpenMP используют pthreads для базовой реализации, если только реализация не выполнила какую-либо работу, пользователь не может напрямую вызвать библиотеку pthreads и заставить ее работать вместе с OpenMP. Текущий пример этого - ошибка gcc 42616 (цикл OMP внутри pthread приводит к сбою). Другим примером является Intel, компилятор которого поддерживает множество параллельных моделей, но попытался заставить их работать вместе. Поскольку вы не сказали, какой компилятор вы собираетесь использовать, все, что я могу сказать, это попробовать небольшой пример кода, чтобы увидеть, работает ли он, прежде чем совершать что-то большое.

Я пробовал что-то подобное в прошлом. Я использовал pthreads, который затем использовал OpenMP-конструкции. Я обнаружил, что для моего приложения это сработало. Каждый pthread считался исходной нитью, когда встречалась параллельная область OpenMP. Затем среда OpenMP создала дополнительные потоки для региона и запустила область. Так как большинство реализаций OpenMP не уничтожают потоки, но помещают их в свободный пул для повторного использования, когда другой регион встречается, накладные расходы выглядят нормально, но тогда мне пришлось много работать в этом регионе. Так что это может сработать - но вы должны быть осторожны.

+0

Спасибо. Итак, чтобы подвести итог, если вы хотите быть в безопасности, конструкции OpenMP должны выполняться только в основном потоке. Но из отчета об ошибке я считаю, что он должен работать, и ничто не запрещено (по крайней мере, не для gcc). – tauran

Смежные вопросы