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

Многим известно, что 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.

Минимально необходимая конфигурация установки

dfc588c5b13894f295865f921ec19f0f.png

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

9787ff861b993cd8758737be622e8063.png

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

1000×1000

2.536 мс

5.812 мс

10000×10000

195.123 мс

297.219 мс

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

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

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

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

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

1000×1000

0.83256 мс

1.421 мс

10000×10000

153.241699

16.105 мс

20000×20000

256.836761 мс

52.155 мс

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

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

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

P.S.

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

© Habrahabr.ru