[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.
Минимально необходимая конфигурация установки
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
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. Решил написать, так как очень долго сам провозился с настройкой всего этого дела. Может быть кто-то с её помощью сэкономит своё время.