Ответ 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.