Сравнение производительности CUDA и OpenCL

Я использую CUDA 6.0 и реализацию OpenCL, поставляемую вместе с CUDA SDK. У меня есть два одинаковых ядра для каждой платформы (они различаются в ключевых словах платформы). Они только читают и записывают глобальную память, каждый поток отличается от другого. Конфигурация запуска для CUDA составляет 200 blocks of 250 threads (1D), что напрямую соответствует конфигурации OpenCL - 50,000 global work size and 250 local work size.

Код OpenCL работает быстрее. Возможно ли это, или я не ошибаюсь? Я понимаю, что реализация NVIDIA OpenCL основана на версии для CUDA. Я получаю 15% лучшую производительность с OpenCL.

Было бы здорово, если бы вы могли предположить, почему я могу видеть это и, возможно, некоторые различия между CUDA и OpenCL, реализованные NVIDIA?

Ответ 1

Ядра, выполняющиеся на современном графическом процессоре, почти никогда не вычисляются и почти всегда связаны с пропускной способностью. (Потому что так много вычислительных ядер работает по сравнению с доступным путем к памяти.)

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

На практике это очень сложно предсказать (или даже понять), какую производительность ожидать раньше времени.

Различия, которые вы наблюдали, вероятно, объясняются небольшими различиями в шаблонах доступа к памяти между двумя ядрами, которые возникают в результате различных оптимизаций, созданных инструментальной цепочкой OpenCL vs CUDA.

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