OpenCL против производительности OpenMP

Проводились ли какие-либо исследования, сравнивающие производительность OpenCL с OpenMP? В частности, меня интересуют накладные расходы на запуск потоков с помощью OpenCL, например, если нужно разложить домен на очень большое количество отдельных рабочих элементов (каждый из которых выполняется потоком, выполняющим небольшую работу) по сравнению с более тяжелыми потоками веса в OpenMP, домен был разложен на поддомены, число которых равно числу ядер.

Кажется, что модель программирования OpenCL более ориентирована на массивные параллельные чипы (например, графические процессоры), а не на процессоры с меньшим, но более мощным ядерным процессором.

Может ли OpenCL стать эффективной заменой OpenMP?

Ответ 1

Тесты, которые я видел, показывают, что OpenCL и OpenMP, работающие на одном и том же оборудовании, обычно сравнимы по производительности, или OpenMP имеет немного лучшую производительность. Тем не менее, я не видел никаких контрольных показателей, которые я бы счел окончательными, потому что им в основном не было подробных объяснений их методологии. Однако есть несколько полезных вещей, которые следует учитывать:

  • OpenCL всегда будет иметь дополнительные накладные расходы при компиляции ядра во время выполнения. Любой тест должен либо перечислить это время отдельно, либо использовать предварительно скомпилированные родные ядра, либо работать достаточно долго, чтобы компиляция ядра была незначительной.

  • Реализации OpenCL будут различаться. Производители графических процессоров, такие как NVidia, не имеют никаких стимулов для того, чтобы их реализация на базе процессоров на базе процессоров была как можно быстрее. Ни одна из реализаций OpenCL, скорее всего, не будет столь же зрелой, как хорошая реализация OpenMP.

  • В спецификации OpenCL практически ничего не говорится о том, как реализация на основе процессора использует потоки под капотом, поэтому любое обсуждение того, является ли нарезка относительно легким или тяжелым, обязательно будет специфичным для реализации.

  • Когда вы используете код OpenCL на CPU, ваши рабочие элементы не обязательно должны быть крошечными и многочисленными. Вы можете разбить проблему так же, как и для OpenMP.

Даже если OpenCL имеет немного больше накладных расходов, могут быть другие причины, чтобы предпочесть его.

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

  • Хорошая реализация OpenCL на базе процессора означает, что вы автоматически получите преимущество любых расширений набора инструкций для поддержки CPU и OpenCL. С помощью OpenMP вам необходимо выполнить дополнительную работу, чтобы убедиться, что ваш исполняемый файл содержит как кодовые пути SSEx, так и AVX.

  • Яркие примитивы OpenCL могут помочь вам выразить некоторые явные parallelism без ущерба для переносимости и удобочитаемости, которые вы получаете от использования встроенных функций SSE.

Ответ 2

У меня есть программа, которая имеет возможность использовать openCL или openMP для некоторых ключевых узких мест, в основном добавляя векторы и выполняя сокращения.

В моем случае openMP занимает 13 секунд, когда openCL занимает 10 секунд, на CPU. Intel I5.

Самая быстрая конфигурация для меня до сих пор заключается в добавлении векторов с использованием OpenCL GPU, а также сокращения на openMP, доведя меня до 7 секунд. Когда я делаю сокращение на ядре openCL, на GPU, он занимает в общей сложности 8 секунд.

Итак, по моему опыту, я бы сказал, может быть, это зависит от использования, и вы можете оптимизировать свое ядро ​​openCL.