Ответ 1
Ядра, выполняющиеся на современном графическом процессоре, почти никогда не вычисляются и почти всегда связаны с пропускной способностью. (Потому что так много вычислительных ядер работает по сравнению с доступным путем к памяти.)
Это означает, что производительность данного ядра обычно во многом зависит от шаблонов доступа к памяти, отображаемых данным алгоритмом.
На практике это очень сложно предсказать (или даже понять), какую производительность ожидать раньше времени.
Различия, которые вы наблюдали, вероятно, объясняются небольшими различиями в шаблонах доступа к памяти между двумя ядрами, которые возникают в результате различных оптимизаций, созданных инструментальной цепочкой OpenCL vs CUDA.
Чтобы узнать, как оптимизировать свои ядра графических процессоров, вам нужно узнать детали доступного для вас оборудования для кэширования памяти и как использовать его для наилучшего использования. (например, стратегическое использование "локальных" кэшей памяти, а также прямое обращение к "глобальной" памяти в OpenCL.)