Хабровчане уже слышали о 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)"
В последней строке -pcal означает, что генерируется только ядро GPU, часть CPU будет опущена (компиляция может занять много времени, да и не всегда нужна).cl /P /C file.br copy file.i file_pp.br "$(BROOKROOT)\sdk\bin\brcc_d.exe" -k -p cal file_pp.br
Структура программы
Вызвал как-то так: беззнаковое целое число 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 мы сразу задаем данные для каждого потока.kernel void your_kernel(float input<>, out float output<>, float val) { if (input > val) { output = 1.0f; } else { output = 0.0f; } }
Вот и все :-) При работе помните, что пока массивы и структуры в .
br файлах не поддерживаются должным образом :-) Также нужно помнить, что переменные нужно определять только в начале тела функции, это не C++ :-) Brook+ поддерживает и другие варианты запуска: когда исходные данные берутся из общего массива, когда определяются «координаты» потока (как в CUDA), накопление ядер (т.е.
, например, можно считать сумму всех чисел в массиве).
Обо всем этом вы можете прочитать в документации или примерах SDK. Оптимизация Методы оптимизации в целом такие же, как и CUDA:
- Как можно меньше ветвей в коде, когда разные потоки идут по разным путям.
Этот код не выполняется параллельно.
- Поскольку каждый процессор является суперскалярным, вам необходимо убедиться, что в вашем коде всегда есть как минимум 5 независимых инструкций.
Самый простой способ добиться этого — развернуть цикл вручную 5 раз (надеюсь, в будущем это можно будет сделать с помощью #pragma unroll(5))
- Используйте как можно меньше памяти.
Чем меньше памяти вы используете, тем тише будет кэш :-)
Вы можете спросить на русском языке на моем форуме например, где я отвечу :-) А еще многие живут на gpgpu.ru .
Заключение Подведем итог: Brook+ позволяет добиться феноменальной производительности на хорошо распараллеленных задачах, не требующих большого объема памяти, ценой дополнительных усилий по программированию в не очень удобной среде :-).
Я надеюсь, что это введение поможет людям начать программировать на Brook+.
Если возникнут проблемы/вопросы, буду рад помочь.
Что ж, впереди нас ждет знакомство с OpenCL и SIMD x86. Теги: #GPGPU #AMD #Brook #высокопроизводительные вычисления #поток #Компьютерное оборудование
-
Usb-Боксер – Игрушка Для Гиков
19 Oct, 24 -
Айфон Мне
19 Oct, 24