Хотя я все еще новичок в OpenCL (и почти не смотрю на CUDA), оптимизация на уровне разработчика может быть обобщена как структурирование вашего кода так, чтобы оно соответствовало предпочтительному аппаратному (и компиляторному) способу работы.
В графических процессорах это может быть что угодно, от правильного упорядочения ваших данных, чтобы использовать преимущества когерентности кэша (графические процессоры любят работать с кэшированными данными, от вершины вплоть до отдельных ядер (существует несколько уровней кэша)) чтобы воспользоваться преимуществами встроенных операций, таких как векторные и матричные манипуляции. Недавно мне пришлось реализовать FDTD в OpenCL, и я обнаружил, что, заменяя расширенные точечные / перекрестные продукты в популярных реализациях матричными операциями (которые любят графические процессоры!), Переупорядочиваем циклы так, чтобы измерение X (элементы которых хранятся последовательно), обрабатывается в самом внутреннем цикле, а не во внешнем, избегая разветвлений (которые ненавидят графические процессоры) и т. д. Мне удалось повысить быстродействие примерно на 20%. Эти оптимизации должны работать в сборке CUDA, OpenCL или даже GPU, и я ожидаю, что это будет справедливо для всех наиболее эффективных оптимизаций GPU.
Конечно, большая часть этого зависит от приложения, поэтому может попадать в категорию TIAS (попробуй и посмотри).
Вот несколько ссылок, которые я нахожу многообещающими:
NVIDIA - лучшие практики для программирования OpenCL
AMD - Портирование CUDA в OpenCL
Мое исследование (и даже документация NVIDIA) указывает на соответствие почти 1: 1 между CUDA и OpenCL, поэтому я был бы очень удивлен, если бы оптимизация не перешла между ними. Большая часть того, что я прочитал, посвящена когерентности кэша, избеганию ветвления и т. Д.
Кроме того, обратите внимание, что в случае OpenCL фактический процесс компиляции выполняется поставщиком (я полагаю, что это происходит в видеодрайвере), поэтому, возможно, стоит взглянуть на документацию по драйверу и комплекты OpenCL от ваш поставщик (NVIDIA, ATI, Intel (?) и т. д.).