CUDA, ROCm, satuAPI? — Menjalankan Kode pada GPU, Semua GPU
Mengapa mengetahui model pemrograman GPU beberapa vendor adalah kejahatan yang diperlukan… atau bukan?
pengantar
Dalam dua posting terakhir saya tentang pemrograman paralel dan akselerator, saya berbicara tentang dasar-dasar pemrograman akselerator dan paralel dan beberapa konsep pemrograman yang diperlukan untuk memastikan kebenaran kode Anda. Pertanyaan menarik bagi programmer yang mempelajari pemrograman akselerator adalah “Apakah saya benar-benar perlu mempelajari CUDA, ROCm, dan SYCL untuk memprogram akselerator NVIDIA, AMD, dan Intel?”
Saat merencanakan seri ini, saya berharap untuk mendalami kesamaan dan perbedaan antara eksekusi perangkat keras dan model memori dari setiap arsitektur. Saya akan berbicara tentang warps, wavefronts dan workgroups, masing-masing konstruksi yang digunakan CUDA, ROCm dan SYCL untuk mengelompokkan eksekusi pada utas perangkat keras. Namun, semakin saya memikirkannya, semakin banyak yang tampaknya terlalu berlebihan untuk sebuah posting blog. Jika Anda tertarik dengan topik tersebut, lihat Nice SYCL untuk pengembang CUDA dari Codeplay.
Alih-alih, hari ini saya akan fokus pada cara membuat Anda dari tanpa kode menjadi berjalan di GPU, GPU apa pun, secepat mungkin. Tidak ada yang semenyenangkan melihat manfaat kinerja akselerator Anda secepat mungkin. Bagi saya, ini menyenangkan karena bertepatan dengan perilisan Codeplay oneAPI for NVIDIA dan oneAPI for AMD (beta) .
SYCL dan beberapa GPU vendor
SYCL adalah model pemrograman yang memiliki dukungan kompiler untuk GPU NVIDIA, AMD, dan Intel. Anda dapat menulis kode Anda di SYCL lalu membangun dan menjalankannya di GPU vendor tersebut. Sebelumnya ini diperlukan menggunakan berbagai kompiler komunitas, atau membuat kompiler Sumber Terbuka Intel, tergantung pada target GPU Anda. Dengan dirilisnya toolchain Codeplay terbaru, Anda sekarang dapat menjalankan kode dengan cepat dan mudah melalui satu toolchain siap pakai. Untuk detail lebih lanjut tentang ini, Anda dapat membaca blog Ruyman Reyes, CTO Codeplay, di rilis baru mereka.
Satu pertanyaan yang mungkin Anda tanyakan adalah dapatkah saya benar-benar membuat kode saya sekali dan kemudian memutuskan pada saat runtime GPU mana yang akan dijalankan? Jawabannya adalah YA ! Ini adalah hal yang menyenangkan tentang dukungan ini, Anda membangun kode Anda sekali dan pada waktu proses, Anda dapat memilih target secara manual, atau membiarkan pustaka waktu proses memilihkan untuk Anda secara otomatis.
Karena Anda sudah sampai sejauh ini, saya akan menganggap ini menarik bagi Anda dan tujuan saya adalah membuat Anda siap dan menjalankan GPU pilihan Anda. Untuk tujuan saya, saya menguji ketiga GPU vendor di Ubuntu 22.04 dan melakukan penginstalan melalui APT.
Menginstal rantai alat Codeplay
Pertama, kami menyiapkan beberapa paket sistem dasar:
sudo apt update
sudo apt -y install cmake pkg-config build-essential
# download the key to system keyring
wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
# add signed entry to apt sources and configure the APT client to use Intel repository:
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo apt-update
sudo apt install intel-basekit
Pastikan Anda memiliki driver dasar/kerangka kerja yang Anda butuhkan untuk setiap GPU yang Anda miliki/ingin targetkan, sekali lagi saya menautkan instruksi Ubuntu:
Instal Driver Intel GPU
Petunjuk untuk GPU Intel pada OS yang berbeda dapat ditemukan di sini . Karena saya menggunakan Intel Arc di Ubuntu 22.04, saya mengikuti petunjuk ini .
oneAPI untuk Instalasi NVIDIA
Anda dapat pergi ke sini untuk mendapatkan instruksi resmi terbaru tentang cara menginstal CUDA, saya menjelaskan apa yang saya gunakan untuk mengaktifkan dan menjalankannya:
- Instal keyring CUDA, CUDA dan reboot
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get install cuda-11-7
sudo apt-get install nvidia-gds
sudo reboot
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
sh oneapi-for-nvidia-gpus-2023.0.0-linux.sh
. /opt/intel/oneapi/setvars.sh --include-intel-llvm
export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
Anda dapat pergi ke sini untuk mendapatkan instruksi resmi terbaru tentang cara menginstal ROCm, sekali lagi sebariskan di sini untuk mempermudah Anda:
- Instal program AMD amdgpu-install melalui APT
sudo apt-get update
wget https://repo.radeon.com/amdgpu-install/5.4.1/ubuntu/jammy/amdgpu-install_5.4.50401-1_all.deb
sudo apt-get install ./amdgpu-install_5.4.50401-1_all.deb
amdgpu-install --usecase="dkms,graphics,opencl,hip,hiplibsdk"
sh oneapi-for-amd-gpus-2023.0.0-linux.sh
. /opt/intel/oneapi/setvars.sh --include-intel-llvm
export PATH=/PATH_TO_ROCM_ROOT/bin:$PATH
export LD_LIBRARY_PATH=/PATH_TO_ROCM_ROOT/lib:$LD_LIBRARY_PATH
Ada banyak contoh kode berbeda yang dapat Anda coba di open source, contoh oneAPI repositori GitHub:
Dari contoh Codeplay Anda dapat melihat mereka membuat simple-sycl-app.cpp ini:
#include <sycl/sycl.hpp>
int main() {
// Creating buffer of 4 ints to be used inside the kernel code
sycl::buffer<sycl::cl_int, 1> Buffer(4);
// Creating SYCL queue
sycl::queue Queue;
// Size of index space for kernel
sycl::range<1> NumOfWorkItems{Buffer.size()};
// Submitting command group(work) to queue
Queue.submit([&](sycl::handler &cgh) {
// Getting write only access to the buffer on a device
auto Accessor = Buffer.get_access<sycl::access::mode::write>(cgh);
// Executing kernel
cgh.parallel_for<class FillBuffer>(
NumOfWorkItems, [=](sycl::id<1> WIid) {
// Fill buffer with indexes
Accessor[WIid] = (sycl::cl_int)WIid.get(0);
});
});
// Getting read only access to the buffer on the host.
// Implicit barrier waiting for queue to complete the work.
const auto HostAccessor = Buffer.get_access<sycl::access::mode::read>();
// Check the results
bool MismatchFound = false;
for (size_t I = 0; I < Buffer.size(); ++I) {
if (HostAccessor[I] != I) {
std::cout << "The result is incorrect for element: " << I
<< " , expected: " << I << " , got: " << HostAccessor[I]
<< std::endl;
MismatchFound = true;
}
}
if (!MismatchFound) {
std::cout << "The results are correct!" << std::endl;
}
return MismatchFound;
}
Biasanya untuk membangun berbagai target kami, kami dapat menggunakan baris perintah yang terlihat seperti ini:
NVIDIA:
clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda simple-sycl-app.cpp -o simple-sycl-app
clang++ -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=<ARCH> simple-sycl-app.cpp -o simple-sycl-app
clang++ -fsycl -fsycl-targets=spir64 simple-sycl-app.cpp -o simple-sycl-app
Membangun untuk beberapa GPU vendor
Katakanlah saya ingin menjalankan untuk NVIDIA dan Intel GPU pada saat yang sama, saya benar-benar dapat membuat biner gemuk yang akan berjalan baik pada GPU NVIDIA atau Intel. Triknya di sini adalah mengatur parameter baris perintah build Anda dengan tepat agar memiliki beberapa target SYCL.
clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda,spir64 simple-sycl-app.cpp -o simple-sycl-app
tonym@LianLi-Linux:~/dev/2023.0Test$ clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda,spir64 simple-sycl-app.cpp -o simple-sycl-app
tonym@LianLi-Linux:~/dev/2023.0Test$ SYCL_DEVICE_FILTER=cuda SYCL_PI_TRACE=1 ./simple-sycl-app
SYCL_PI_TRACE[basic]: Plugin found and successfully loaded: libpi_cuda.so [ PluginVersion: 11.15.1 ]
SYCL_PI_TRACE[all]: Selected device: -> final score = 1500
SYCL_PI_TRACE[all]: platform: NVIDIA CUDA BACKEND
SYCL_PI_TRACE[all]: device: NVIDIA GeForce RTX 3080 Ti
The results are correct!
tonym@LianLi-Linux:~/dev/2023.0Test$
tonym@LianLi-Linux:~/dev/2023.0Test$ SYCL_DEVICE_FILTER=ext_oneapi_level_zero:gpu:0 SYCL_PI_TRACE=1 ./simple-sycl-app
SYCL_PI_TRACE[basic]: Plugin found and successfully loaded: libpi_level_zero.so [ PluginVersion: 11.15.1 ]
SYCL_PI_TRACE[all]: Selected device: -> final score = 1550
SYCL_PI_TRACE[all]: platform: Intel(R) Level-Zero
SYCL_PI_TRACE[all]: device: Intel(R) Graphics [0x56a0]
The results are correct!
Pekerjaan masa depan
Beberapa pembaca yang cerdik mungkin menyadari bahwa saya tidak menyertakan contoh AMD dalam contoh GPU multivendor saya. Ini terjadi karena saya baru saja mengganti GPU AMD 6800XT dengan GPU AMD RX 7900XT yang baru. Sayangnya, ROCm saat ini tidak terinstal dengan benar di sistem Linux saya terlepas dari kernel yang saya gunakan dengan kartu RDNA3. Setelah ini diperbarui, saya akan kembali dan memberikan instruksi dengan contoh yang berjalan di ketiga kartu.
Perhatikan bahwa sebelumnya versi aliran ini berfungsi untuk 6800XT, tetapi itu sebelum perangkat lunak Codeplay dirilis menggunakan aliran DPC++ sumber terbuka yang didokumentasikan di sini:
Kesimpulan
OneAPI untuk GPU NVIDIA dari Codeplay memungkinkan saya membuat binari untuk GPU NVIDIA atau Intel dengan mudah. Waktu untuk menyiapkan oneAPI tambahan untuk GPU NVIDIA adalah sekitar 10 menit di atas waktu untuk menginstal Intel oneAPI Base Toolkit. Ini termasuk menginstal CUDA dan perangkat lunak Codeplay.
Perangkat lunak Codeplay baru membuka opsi baru bagi individu dan perusahaan yang mempertimbangkan opsi GPU multivendor. Sebelum opsinya adalah open source, kompiler yang didukung komunitas. Ini adalah opsi yang fantastis dan biasanya saya gunakan untuk pekerjaan sehari-hari.
Namun bagi orang-orang yang mempertimbangkan dukungan jangka panjang, alias bisnis mengandalkan rantai alat untuk mata pencaharian mereka, memiliki opsi yang didukung secara resmi dari Codeplay dan Intel dapat membantu memberikan ketenangan pikiran.
Jika Anda ingin melihat berita teknologi acak apa yang saya baca, Anda dapat mengikuti saya di Twitter. Juga, lihat Code Together , podcast Intel untuk pengembang yang saya host tempat kami berbicara tentang teknologi.
Tony adalah Arsitek Perangkat Lunak dan Penginjil Teknis di Intel. Dia adalah arsitek Intel VTune Profiler dan alat kinerja lainnya dan baru-baru ini memimpin tim rekayasa perangkat lunak yang membangun platform pusat data yang memungkinkan solusi MLPerf yang dapat diskalakan dari Habana.

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































