#optimization #cuda #opencl
#оптимизация #cuda #opencl
Вопрос:
Чем больше я узнаю об OpenCL, тем больше мне кажется, что правильная оптимизация вашего ядра является ключом к успеху. Кроме того, я заметил, что ядра для обоих языков кажутся очень похожими.
Итак, насколько разумным было бы использовать стратегии оптимизации Cuda, изученные из книг и руководств по ядрам OpenCL? … Учитывая, что существует гораздо больше (хорошей) литературы по Cuda, чем по OpenCL.
Каково ваше мнение по этому поводу? Каков ваш опыт?
Спасибо!
Комментарии:
1. На каком устройстве вы запускаете свой OpenCL? Графический процессор (NVIDIA)? Скорее всего, «лучшие практики» для CUDA будут переведены и на OpenCL.
Ответ №1:
Если вы работаете только с картами nvidia, вы можете использовать одни и те же подходы к оптимизации как в CUDA, так и в OpenCL. Однако следует иметь в виду несколько вещей: OpenCL может иметь большее время запуска (это было некоторое время назад, когда я экспериментировал с ними обоими) по сравнению с CUDA на картах nvidia.
Однако, если вы собираетесь работать с разными архитектурами, вам нужно будет найти способ обобщить вашу программу OpenCL, чтобы она была оптимальной для нескольких платформ, что невозможно с CUDA.
Но некоторые из нескольких базовых подходов оптимизации останутся прежними. Например, на любой платформе будет справедливо следующее.
- Чтение из выровненных адресов памяти и запись в них будут иметь более высокую производительность (и иногда необходимы на платформах, подобных процессору Cell).
- Знание и понимание ограниченных ресурсов каждой платформы. (может ли это называться постоянной памятью, разделяемой памятью, локальной памятью или кэшем).
- Понимание параллельного программирования. Например, определение компромисса между повышением производительности (запуск большего количества потоков) и накладными расходами (запуск, связь и синхронизация).
Эта последняя часть полезна во всех видах параллельного программирования (будь то многоядерные, многоядерные или грид-вычисления).
Ответ №2:
Хотя я все еще новичок в OpenCL (и едва взглянул на CUDA), оптимизацию на уровне разработчика можно резюмировать как структурирование вашего кода таким образом, чтобы он соответствовал предпочтительному способу работы оборудования (и компилятора).
На графических процессорах это может быть что угодно: от правильного упорядочивания ваших данных, чтобы воспользоваться преимуществами согласованности кэша (графические процессоры ЛЮБЯТ работать с кэшированными данными, начиная с верхнего уровня вплоть до отдельных ядер [существует несколько уровней кэша]), до использования преимуществ встроенных операций, таких как манипулирование векторами и матрицами. Недавно мне пришлось внедрить FDTD в OpenCL и я обнаружил, что, заменив расширенные точечные / перекрестные произведения в популярных реализациях матричными операциями (которые обожают графические процессоры!), изменив порядок циклов так, чтобы измерение X (элементы которого хранятся последовательно) обрабатывалось во внутреннем цикле вместо внешнего, избегая ветвления (которое графические процессоры ненавидят) и т.д., Я смог увеличить быстродействие примерно на 20%. Эти оптимизации должны работать в CUDA, OpenCL или даже в сборке GPU, и я ожидаю, что это будет справедливо для всех наиболее эффективных оптимизаций GPU.
Конечно, большая часть этого зависит от приложения, поэтому может подпадать под категорию TIAS (попробуйте и увидите).
Вот несколько ссылок, которые, по моему мнению, выглядят многообещающими:
NVIDIA — лучшие практики для программирования на OpenCL
Мои исследования (и даже документация NVIDIA) указывают на соответствие между CUDA и OpenCL почти в соотношении 1: 1, поэтому я был бы очень удивлен, если бы оптимизация не соответствовала требованиям между ними. Большая часть того, что я прочитал, фокусируется на согласованности кэша, избегая ветвления и т.д.
Также обратите внимание, что в случае OpenCL фактический процесс компиляции выполняется поставщиком (я полагаю, что это происходит в видеодрайвере), поэтому, возможно, стоит взглянуть на документацию по драйверам и комплекты OpenCL от вашего поставщика (NVIDIA, ATI, Intel (?) и т.д.).