Использование подходов оптимизации Cuda для OpenCL - PullRequest
3 голосов
/ 09 мая 2011

Чем больше я узнаю об OpenCL, тем больше кажется, что правильная оптимизация вашего ядра - ключ к успеху.Кроме того, я заметил, что ядра для обоих языков кажутся очень похожими.

Итак, насколько разумно было бы использовать стратегии оптимизации Cuda, изученные из книг и учебных пособий по ядрам OpenCL?... Учитывая, что существует гораздо больше (хорошей) литературы по Cuda, чем по OpenCL.

Что вы думаете об этом?Каков ваш опыт?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

Если вы работаете только с картами NVIDIA, вы можете использовать одинаковые подходы к оптимизации как в CUDA, так и в OpenCL.Однако следует помнить о нескольких моментах: OpenCL может иметь большее время запуска (это было некоторое время назад, когда я экспериментировал с ними обоими) по сравнению с CUDA на картах NVIDIA.

Однако, если выПри работе с различными архитектурами вам нужно будет найти способ обобщить вашу программу OpenCL, чтобы она была оптимальной для нескольких платформ, что невозможно в CUDA.

Но некоторые из немногих базовых подходов к оптимизации останутся прежними.Например, на любой платформе будет верно следующее.

  1. Чтение и запись в адреса памяти, которые выровнены, будут иметь более высокую производительность (а иногда это необходимо на платформах, таких как Cell Processor).
  2. Знание и понимание ограниченных ресурсов каждой платформы.(можно назвать постоянной памятью, разделяемой памятью, локальной памятью или кешем).
  3. Понимание параллельного программирования.Например, выяснение компромисса между повышением производительности (запуск большего количества потоков) и накладными расходами (запуск, связь и синхронизация).

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

3 голосов
/ 09 мая 2011

Хотя я все еще новичок в 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 (?) и т. д.).

...