Amd Brook+: Сразу С Места В Карьер

Хабровчане уже слышали о nVidia CUDA, теперь очередь AMD Brook+.

Brook+ позволяет писать программы на языке C и запускать их на видеокартах AMD (а как вариант — автоматически генерировать версию CPU со средним качеством кода).

Достижимая производительность — около 600 миллиардов операций на AMD 4870. Н.

Б.

: Статья является кратким введением, не стоит ожидать освещения всех аспектов программирования на Brook+ :-) Об оборудовании Brook+ работает начиная с карт HD2xxx (с ограничениями), а нормально начинает работать с серии 3xxx. Если в рекламе вы видите, что процессоров 4870 800, то на самом деле их 160, каждый из которых выполняет 5 инструкций за такт (3-я серия имела серьезные ограничения на одновременно выполняемые инструкции, 4-я серия справляется практически с любыми) .

В отличие от CUDA, где все довольно «низкоуровнево», с Brook+ компилятор все делает за вас, все само кэшируется везде и быстро перестает работать в самый неподходящий момент. С другой стороны, AMD кэширует доступ к памяти карты, а nVidia — нет. С чего начать? Как обычно, лучше начать с рабочего примера SDK (расскажу на примере Visual Studio 2005, Linux тоже поддерживается).

Скачать SDK можно здесь: http://ati.amd.com/technology/streamcomputing/sdkdwnld.html. Откройте sample.sln, вы можете начать с проекта hello_brook. Обратите внимание на Custom Build Rule для файла hello_brook.br — он генерирует файлы .

h и .

cpp, которые вам нужно использовать в проекте:



mkdir brookgenfiles | "$(BROOKROOT)\sdk\bin\brcc_d.exe" -o "$(ProjectDir)\brookgenfiles\$(InputName)" "$(InputPath)"

Поскольку препроцессор не поддерживается, его можно вызвать отдельно самостоятельно, может получиться что-то вроде этого:


cl /P /C file.br copy file.i file_pp.br "$(BROOKROOT)\sdk\bin\brcc_d.exe" -k -p cal file_pp.br

В последней строке -pcal означает, что генерируется только ядро GPU, часть CPU будет опущена (компиляция может занять много времени, да и не всегда нужна).

Структура программы



kernel void your_kernel(float input<>, out float output<>, float val) { if (input > val) { output = 1.0f; } else { output = 0.0f; } }

Вызвал как-то так: беззнаковое целое число dim[] = {800*100}; ::brook::Stream inputStream(1, dim); ::brook::Stream outputStream(1, dim); inputStream.read(_input); your_kernel (inputStream, outputStream, 123.35); выводStream.write(_output); Стоит отметить, что в отличие от CUDA мы сразу задаем данные для каждого потока.

Вот и все :-) При работе помните, что пока массивы и структуры в .

br файлах не поддерживаются должным образом :-) Также нужно помнить, что переменные нужно определять только в начале тела функции, это не C++ :-) Brook+ поддерживает и другие варианты запуска: когда исходные данные берутся из общего массива, когда определяются «координаты» потока (как в CUDA), накопление ядер (т.е.

, например, можно считать сумму всех чисел в массиве).

Обо всем этом вы можете прочитать в документации или примерах SDK. Оптимизация Методы оптимизации в целом такие же, как и CUDA:

  • Как можно меньше ветвей в коде, когда разные потоки идут по разным путям.

    Этот код не выполняется параллельно.

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

    Самый простой способ добиться этого — развернуть цикл вручную 5 раз (надеюсь, в будущем это можно будет сделать с помощью #pragma unroll(5))

  • Используйте как можно меньше памяти.

    Чем меньше памяти вы используете, тем тише будет кэш :-)

Не работает? Прежде всего, вам следует прочитать документацию вместе с SDK в папке Brook+_Documentation. Тогда вы можете спросить официальный форум — к сожалению, разработчики там не очень часто отписываются.

Вы можете спросить на русском языке на моем форуме например, где я отвечу :-) А еще многие живут на gpgpu.ru .

Заключение Подведем итог: Brook+ позволяет добиться феноменальной производительности на хорошо распараллеленных задачах, не требующих большого объема памяти, ценой дополнительных усилий по программированию в не очень удобной среде :-).

Я надеюсь, что это введение поможет людям начать программировать на Brook+.

Если возникнут проблемы/вопросы, буду рад помочь.

Что ж, впереди нас ждет знакомство с OpenCL и SIMD x86. Теги: #GPGPU #AMD #Brook #высокопроизводительные вычисления #поток #Компьютерное оборудование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.