Запуск кода CUDA на видеокартах AMD

в 16:53, , рубрики: CUDA, gpgpu, rocm

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

В 2016 году AMD представила в буквальном смысле клон платформы CUDA — ROCm. Альтернативы модулей CUDA для ROCm можно увидеть в таблице с официального сайта AMD.

Таблица соответствия модулей платформ

Модуль платформы CUDA

Модуль платформы ROCm

cuBLAS

rocBLAS

cuFFT

rocFFT

cuSPARSE

rocSPARSE

cuSolver

rocSOLVER

AMG-X

rocALUTION

Thrust

rocThrust

CUB

rocPRIM

cuDNN

MIOpen

cuRAND

rocRAND

EIGEN

EIGEN

NCCL

RCCL

Данная библиотека позволяет в автоматическом режиме переносить исходный код предназначенный для платформы CUDA на ROCm и выполнять его компиляцию. Одним из недостатков данной платформы является исключительная ориентированность на ОС Linux.

Перейдем непосредственно к переносу кода и сравнению производительности платформ.

Тестовая конфигурация

ПК 1

ПК 2

Операционная система

Windows 10 Pro 21H1

Ubuntu 22.04

5.15.0-53-generic

CPU

x2 Intel Xeon Gold 6132

i5-12600K

RAM

x4 DDR4 16GB

x1 DDR4 32GB

GPU

GeForce RTX 3070 8GB

Radeon RX 6800 XT 16GB

1. Установка CUDA на ОС Windows

Переходим на сайт NVidia (https://developer.nvidia.com/cuda-downloads) и скачиваем последнюю версию CUDA Toolkit для необходимой платформы. На скриншоте ниже представлена минимально необходимая конфигурация для компиляции и запуска платформы CUDA на ОС Windows.

Минимально необходимая конфигурация установки
Запуск кода CUDA на видеокартах AMD - 1

2. Установка ROCm на ОС Linux

Рассмотрим ход установки ROCm на ОС Ubuntu 22.04. (https://docs.amd.com/bundle/ROCm-Installation-Guide-v5.3/page/How_to_Install_ROCm.html - на данном веб-сайте перечислены способы установки для некоторых других дистрибутивов Linux)

2.1 Загружаем пакет установщика и устанавливаем его.

sudo apt-get update
wget https://repo.radeon.com/amdgpu-install/5.3/ubuntu/jammy/amdgpu-install_5.3.50300-1_all.deb
sudo apt-get install ./amdgpu-install_5.3.50300-1_all.deb

2.2 Установка необходимых компонентов ROCm

sudo amdgpu-install --usecase=dkms,rocm,rocmdevtools,lrt,hip,hiplibsdk,mllib,mlsdk

В процессе установки могут появиться ошибки, однако они никак не должны повлиять на работу платформы. На самом деле я на 100% не уверен, что это минимально необходимый набор модулей для установки, но путем проб и ошибок я пришел именно к этому набору.

2.3 Установка CUDA.

Для портирования кода CUDA на ROCm также необходимо установить CUDA Toolkit. Проще всего это сделать следующей командой. (Другие версии CUDA и методы установки можно найти на данной веб-странице https://developer.nvidia.com/cuda-downloads)

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
Конфигурация установки CUDA
Запуск кода CUDA на видеокартах AMD - 2

3. Компиляция исходного кода на ОС Windows

В качестве тестового примера возьмем код перемножения матриц случайных целых 32-битных чисел с Github (https://github.com/lzhengchun/matrix-cuda).

С помощью команд PowerShell представленных ниже скачиваем и компилируем исходные файлы. После выполнения приведенных ниже команд в директории с исходным кодом появится исполняемый файл "a.exe".

git clone https://github.com/lzhengchun/matrix-cuda
cd matrix-cuda
nvcc ./matrix_cuda.cu

4. Преобразование кода CUDA в код ROCm и его компиляция на ОС Ubuntu

Преобразование кода CUDA в ROCm выполняется при помощи утилиты платформы ROCm HIPIFY(от HIP - язык программирования платформы ROCm)

git clone https://github.com/lzhengchun/matrix-cuda
cd matrix-cuda
/opt/rocm-5.3.0/bin/hipify-clang matrix_cuda.cu

После выполнения данных команд в директории рядом с файлом matrix_cuda.cu появится файл matrix_cuda.cu.hip, который является файлом исходного кода для платформы ROCm.

Компиляция кода для платформы ROCm выполняется при помощи компилятора HIPCC. После выполнения приведенных ниже команд в директории с исходным кодом появится исполняемый файл "a.out".

/opt/rocm-5.3.0/bin/hipсс matrix_cuda.cu.hip

5. Сравнение производительности платформ

Размер матриц

Время выполнения CUDA

Время выполнения ROCm

1000x1000

2.536 мс

5.812 мс

10000x10000

195.123 мс

297.219 мс

В данном примере мы видим, что из-за особенностей архитектуры AMD (меньшее количество блоков для операций над 32-битными числами) наблюдается отставание в производительности в полтора-два раза.

Преобразуем исходные файлы для произведения операций над 16-битными числами и снова протестируем производительность платформ.

Размер матриц

Время выполнения CUDA

Время выполнения ROCm

1000x1000

0.83256 мс

1.421 мс

10000x10000

153.241699

16.105 мс

20000x20000

256.836761 мс

52.155 мс

В случае с операциями на 16-битными числами преимущество в скорости вычислений на стороне платформы ROCm.

6. Заключение

Таким образом у владельцев видеоускорителей AMD Radeon последнего поколения имеется возможность за пару кликов преобразовать код CUDA в код, который будет также быстро работать на "красных" видеокартах.

P.S.

Это моя первая статья на habr. Решил написать, так как очень долго сам провозился с настройкой всего этого дела. Может быть кто-то с её помощью сэкономит своё время.

Автор: Василий

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js