OpenCL, ТББ, OpenMP

Я реализовал несколько обычных циклических приложений в OpenMP, TBB и OpenCL. Во всех этих приложениях OpeCL дает гораздо лучшую производительность, чем другие, когда я запускаю его только на ЦП без каких-либо специальных оптимизаций в ядрах. OpenMP и TBB также дают хорошую производительность, но намного меньше, чем OpenCL, что может быть причиной этого, потому что они оба являются специализированными платформами для ЦП и должны обеспечивать производительность, по крайней мере, равную OpenMP/TBB.

Моя вторая проблема заключается в том, что когда дело доходит до OpenMP и TBB, OpenMP всегда лучше по производительности, чем TBB в моих реализациях, в которых я не настроил его для очень хорошей оптимизации, поскольку я не настолько эксперт. Есть ли причина, по которой OpenMP обычно лучше по производительности, чем TBB? Потому что я думаю, что они оба или даже OpenCL тоже используют один и тот же пул потоков на низком уровне ... Есть мнения экспертов? Спасибо


person Akhtar Ali    schedule 19.08.2011    source источник
comment
Каков ваш алгоритм? Какая у вас ОС и компилятор?   -  person osgx    schedule 20.08.2011


Ответы (3)


Одним из преимуществ OpenCL по сравнению с TBB и OpenMP является то, что он может лучше использовать параллелизм SIMD в вашем оборудовании. Некоторые реализации OpenCL будут запускать ваш код таким образом, что каждый рабочий элемент выполняется в векторной дорожке SIMD машины, а также работает на отдельных ядрах. В зависимости от алгоритма это может обеспечить множество преимуществ в производительности.

Компиляторы C также могут использовать некоторые преимущества параллелизма SIMD, используя автоматическую векторизацию, но правила алиасинга памяти в C затрудняют это в некоторых случаях. Поскольку OpenCL требует, чтобы программисты вызывали рабочие элементы и явно ограничивали доступ к памяти, компилятор OpenCL может быть более агрессивным.

В конце концов, это зависит от вашего кода. Можно найти алгоритм, для которого лучше всего подходит любой из OpenCL, OpenMP или TBB.

person boiler96    schedule 20.08.2011
comment
Я использую компилятор Intel во всех случаях, поэтому я скомпилировал все свои приложения, используя опцию icc -O0, чтобы отключить автоматическую оптимизацию компилятором. Итак, я полагаю, что остановил компилятор от автоматической оптимизации, такой как SIMD и т. Д., Но кто-то сказал мне, что OpenCL нужна опция -cl-opt-disable в функции clBuildProgram для отключения автоматической оптимизации OpenCL; но когда я пытаюсь это сделать, мне выдается ошибка undefined -cl-opt-disable, я использую последнюю версию AMD OpenCL SDK, почему у меня возникает эта проблема? и помогает ли параметр Intel -O0 отключить автоматическую оптимизацию OpenCL? - person Akhtar Ali; 20.08.2011
comment
Если вы используете -O0 в коде C, компилятор, конечно же, не пытается векторизовать. На самом деле, я бы не стал беспокоиться о производительности компилятора кода с -O0. Более интересно сравнить производительность кода с опримизациями компилятора при -O3. - person boiler96; 21.08.2011
comment
@AkhtarAli, вы сравнили код OpenCL с OpenMP и TBB без оптимизации. Это действительно глупо! - person Z boson; 30.09.2014
comment
OpenMP 4 поддерживает SIMD. Подробности смотрите в спецификации. Компиляторы Intel теперь определенно поддерживают эту функцию. - person Jeff Hammond; 21.04.2015

Среда выполнения OpenCL для ЦП и MIC, предоставляемая Intel, использует TBB под капотом. Это далеко не просто «пул потоков на низком уровне», поскольку он использует преимущества сложных алгоритмов планирования и разделения, предоставляемых TBB, для лучшего баланса нагрузки и, следовательно, лучшего использования ЦП.

Что касается TBB против OpenMP. Обычно дело сводится к неправильным измерениям. Например, в TBB нет неявного барьера, как в OpenMP, поэтому цикла прогрева недостаточно. Вы должны убедиться, что все потоки созданы и эти накладные расходы не включены в ваши измерения. Другой пример: иногда компиляторы не могут векторизовать тот же код с помощью TBB, который векторизован с помощью OpenMP.

person Anton    schedule 30.09.2014
comment
Я рассматривал возможность использования TBB вместо OpenMP. Основная функция, которую я искал, - это способ определить топологию потоков (ядра, сокеты, логические процессоры и т. д.), поскольку OpenMP не имеет прямой поддержки для этого, но, похоже, не поддерживает и TBB? Кроме того, TBB основан на задачах, а не на потоках, поэтому вместо того, чтобы давать мне более низкоуровневый контроль, он дает меньше. Я не хочу критиковать. Мне интересно, правильно ли я понимаю TBB и должен ли я снова подумать о TBB. - person Z boson; 30.09.2014
comment
TBB предоставляет task_arena и task_scheduler_observer. Имея это и черный пояс по программированию, вы можете закреплять рабочие потоки по своему усмотрению и ограничивать распределение работы по своему усмотрению. На самом деле эти функции были вызваны функцией деления OpenCL. Программирование на основе потоков нельзя компоновать, это плохо для вложенных алгоритмов, плохо для библиотек. TBB часто превосходит OpenMP благодаря лучшей балансировке нагрузки. - person Anton; 30.09.2014
comment
Лучшая балансировка нагрузки — очень заманчивая функция. Я думаю, что я посмотрю на TBB снова. - person Z boson; 30.09.2014

Ядра OpenCL скомпилированы для данного оборудования. Потенциал оптимизации для конкретных поставщиков/аппаратных средств огромен.

person mbien    schedule 19.08.2011