CUDA, SYCL, Codeplay, dan oneAPI — Akselerator untuk semua | oleh TonyM | Juli 2022

Programming

[ad_1]
Selamat datang Gaes di suratpembaca.web.id. Malam ini kita akan membahas tentang Linux yakni CUDA, SYCL, Codeplay, dan oneAPI — Akselerator untuk semua | oleh TonyM | Juli 2022

.

Sekiranya artikel tentang CUDA, SYCL, Codeplay, dan oneAPI — Akselerator untuk semua | oleh TonyM | Juli 2022

bisa memberikan manfaat untuk Sahabat semua. Langsung saja baca artikel ini
sampai selesai.

CUDA dan SYCL – tes fungsional

Foto oleh Pakata Goh di Unsplash

Jumlah akselerator di dunia meningkat dari hari ke hari. Ini menimbulkan pertanyaan tentang bagaimana ekosistem yang berbeda akan berevolusi untuk memungkinkan pengembang menggunakan akselerator ini. Pada tingkat abstraksi yang lebih tinggi, lapisan khusus domain seperti Tensorflow dan PyTorch memberikan abstraksi yang sangat baik untuk perangkat keras yang mendasarinya. Namun, tantangan tetap ada bagi pengembang yang memelihara kode yang berbicara dengan perangkat keras tanpa abstraksi semacam itu. Salah satu solusi yang didukung pada beberapa arsitektur perangkat keras yang mendasarinya adalah C++ dengan SYCL. Berikut adalah deskripsi SYCL dari halaman web Kronos Group:

SYCL (diucapkan ‘das’) adalah lapisan abstraksi lintas platform bebas royalti yang memungkinkan kode ditulis untuk prosesor heterogen menggunakan standar ISO C++ bersama dengan kode host dan kernel untuk aplikasi yang terdapat dalam file sumber yang sama. .

Ini terdengar cukup bagus dengan asumsi Anda:

  1. Mereka nyaman belajar bahasa seperti C++
  2. Anda menginginkan fleksibilitas untuk tidak terikat dengan vendor perangkat keras utama Anda
  3. Anda memulai kode Anda dari awal

Karena orang yang memprogram pada tingkat tumpukan ini sudah menggunakan C++, aman untuk mengatakan bahwa asumsi pertama masuk akal, dan jika Anda masih membaca, saya akan menganggap nomor dua juga. Namun, poin ketiga seringkali tidak demikian. Di sisa cerita ini, kita akan membahas cara mengambil kode CUDA, mentransfernya ke SYCL, dan kemudian menjalankannya di berbagai jenis perangkat keras, termasuk GPU NVIDIA.

Untuk menguji seberapa layak ini, kami akan menggunakan sejumlah alat yang tersedia secara gratis, termasuk SYCLomatic, OneAPI Base Toolkit, dan kompiler Codeplay oneAPI for CUDA. Untuk informasi tentang versi CUDA yang didukung untuk alat ini, silakan lihat Catatan Rilis Alat Kompatibilitas Intel DPC++ dan Panduan Memulai oneAPI untuk CUDA.

Sebagai referensi, saya menggunakan sistem pribadi Intel Alder Lake Core i9–12900KF Alienware R13 dengan GPU 3080Ti. Tumpukan perangkat lunak saya adalah Windows 11 Pro dan saya sedang mengembangkan di Ubuntu 20.04 menggunakan Windows Subsystem for Linux (WSL).

CUDA sering digunakan untuk pemrograman untuk komputasi tujuan umum pada GPU. Kelemahannya adalah hanya berjalan pada GPU NVIDIA. Untuk membantu bermigrasi dari CUDA ke SYCL, kami akan menggunakan alat kompatibilitas Intel DPC++. Perhatikan bahwa Intel menggunakan teknologi sumber terbuka dari alat kompatibilitas DPC++ untuk meningkatkan kemampuan migrasi guna menghasilkan lebih banyak program berbasis SYCL dalam proyek SYCLomatic.

Sudah ada tulisan bagus yang diposting di Stackoverflow dan Intel Developer Zone yang mengambil implementasi jacobiCudaGraphs dari repositori cuda-samples GitHub dan mem-porting kodenya, jadi alih-alih mengetik ulang, saya hanya akan menautkannya di sini yang saya berikan.

Perhatikan bahwa jika Anda hanya ingin melihat bagaimana kompiler OneAPI untuk CUDA Codeplay bekerja untuk kode SYCL, Anda dapat melewati tutorial ini dan melihat kode terakhir di repositori oneAPI-Samples di GitHub di sini.

Setelah Anda bermigrasi ke kode SYCL, Anda seharusnya dapat menjalankannya di berbagai perangkat keras. Mari kita uji, ya? Untuk membuat tutorial ini lebih mudah diikuti, Anda dapat melihat direktori oneAPI-samples yang menyertakan kode pra-porting:

Untuk tujuan perbandingan, ketika saya mengikuti instruksi sampel-cuda untuk membuat dan menjalankan kode, hasilnya adalah:

Intel menyediakan kompiler berbasis SYCL di OneAPI Base Toolkit, tersedia di sini:

Karena saya menggunakan Ubuntu, saya hanya mengikuti instruksi untuk melakukan instalasi berbasis APT. Pastikan untuk menambahkan jalur kompiler ke ruang kerja Anda dengan menjalankan yang berikut ini:

> source /opt/intel/oneapi/setvars.sh

Saya kemudian pergi ke direktori oneAPI-samples/DirectProgramming/DPC++/DenseLinearAlgebra/jacobi_iterative/sycl_dpct_migrated/src dan mengkompilasi kode menggunakan kompiler Intel DPC++ SYCL:

> dpcpp -o jacobiSyclCPU main.cpp jacobi.cpp -I ../Common/

Perhatikan bahwa ini termasuk ../Common dari alur kerja SYCLomatic, yang membuat beberapa file pembantu untuk mengaktifkan transisi saya dari CUDA ke SYCL. Eksekusi saya dalam hal ini adalah jacobiSyclCPU, jadi mari kita jalankan:

Melihat outputnya, ada beberapa hal yang perlu diperhatikan:

  1. Versi kode SYCL dikompilasi dengan kompiler Intel DPC++ dan contoh kode cuda dikompilasi dengan kompiler GNU.
  2. Kode SYCL porting, awalnya diparalelkan untuk GPU, sekarang berjalan pada CPU dan lebih lambat dari versi serial kode. Ini karena pengaturan dan sinkronisasi buffer memori, yang tidak diperlukan untuk versi serial.
  3. Teks “GPU ***” salah karena saya baru saja memindahkan kode dan tidak mengubah teks untuk menunjukkan bahwa saya menargetkan CPU dalam kasus ini.

Sekarang kita telah melihat bahwa kita dapat menjalankan kode SYCL pada CPU, mari kita lakukan sesuatu yang lebih menarik dan ambil kode porting dan lihat apakah kita benar-benar dapat menjalankannya pada GPU kita.

Langkah pertama adalah menginstal kompiler oneAPI untuk CUDA dari Codeplay. Saya mengikuti instruksi mereka untuk menginstal dan membangun kompiler, yang ada di sini untuk kenyamanan Anda:

git clone https://github.com/intel/llvm.git -b sycl
cd llvm
python ./buildbot/configure.py --cuda -t release --cmake-gen “Unix Makefiles”
cd build
make sycl-toolchain -j `nproc`
make install

Catatan WSL2

Selain itu, saat melakukan instalasi ini, saya perhatikan bahwa itu berjalan sangat lambat, saya bertanya sedikit tentangnya, dan masalahnya adalah saya menjalankan kompilasi saya di WSL pada sistem file Windows alih-alih sistem file WSL ext4. Pindah ke sistem file lokal membuatnya lebih cepat secara eksponensial, jadi itu poin yang bagus. Untuk detail lebih lanjut, lihat beberapa tolok ukur sistem file WSL di sini. Sedikit lebih tua tetapi masih relevan:

https://vxlabs.com/2019/12/06/wsl2-io-measurements/

Kompilasi dan jalankan untuk CUDA

Dengan kompiler saya terinstal, saya siap mengkompilasi untuk dijalankan pada GPU NVIDIA. Mengenai cara menghasilkan kode porting, saya perlu menyertakan file dari kompiler oneAPI DPC++ dan kompiler Codeplay di jalur saya:

> source /opt/intel/oneapi/setvars.sh
> export PATH=/home/etmongko/llvm/build/bin:$PATH
> export LD_LIBRARY_PATH=/home/etmongko/llvm/build/lib:$LD_LIBRARY_PATH

Sekarang saya menjalankan kompiler Codeplay untuk mengaktifkan biner dengan CUDA:

> clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda -DSYCL_USE_NATIVE_FP_ATOMICS -o jacobiSyclCuda main.cpp jacobi.cpp -I ../Common/

Ini menghasilkan biner jacobiSyclCuda. Mari kita coba!

Oh, itu tidak baik

Ah! Kesalahan segmentasi bukanlah awal yang baik. Kabar baiknya adalah saya menemukan masalah dengan sedikit debugging. Saya memiliki perpustakaan oneAPI dan Codeplay di jalur saya yang menyebabkan beberapa masalah. Untuk mengatasi masalah ini, saya membuka terminal baru dan menjalankan:

> export LD_LIBRARY_PATH=/home/etmongko/llvm/build/lib:$LD_LIBRARY_PATH

Sertakan hanya pustaka Codeplay. Setelah tweak sederhana ini, kode SYCL berjalan tanpa masalah pada GPU saya.

Bekerja!

Ya, kita dapat melihat bahwa waktu CPU mirip dengan contoh dasar dan bagian GPU secara signifikan lebih cepat daripada menggunakan CPU sebagai akselerator seperti pada contoh kedua kami. Namun, kinerjanya tidak cukup setara dengan implementasi CUDA asli. Ini tidak terduga karena ini adalah transisi sederhana dari CUDA ke SYCL tanpa pengoptimalan apa pun.

C++ dengan kode SYCL dapat dikompilasi dan dijalankan di banyak backend. Dalam hal ini, kami melihat contoh CPU dan GPU NVIDIA, tetapi keindahan SYCL adalah memungkinkan kami untuk menggunakan backend lain juga. Sebagai penggoda, minggu depan saya akan menguji alur kerja pengembang dengan laptop baru berbasis Intel Arc A370M, jadi kita akan melihat bagaimana SYCL memungkinkan beberapa vendor backend.

Sebagai pengembang, saya pikir konvergensi pada solusi perangkat keras pada akhirnya akan membuat hidup kita lebih mudah, kita hanya perlu sampai di sana. Bermigrasi dari CUDA ke SYCL bukanlah hal yang sepele, tetapi ada banyak dukungan komunitas di sekitarnya dan alat-alatnya terus menjadi lebih baik.

Bukankah lebih baik untuk dapat menjalankan kode Anda pada perangkat keras baru jika lebih cepat atau lebih hemat energi atau lebih terjangkau? Itu pertanyaan untuk lain waktu dan diskusi, tapi itu pemikiran yang bagus.

Want to Connect?If you want to see what random tech news I’m reading, you can follow me on Twitter.Tony is a Software Architect and Technical Evangelist at Intel. He has worked on several software developer tools and most recently led the software engineering team that built the data center platform which enabled Habana’s scalable MLPerf solution.Intel, the Intel logo and other Intel marks are trademarks of Intel Corporation or its subsidiaries. SYCL is a trademark of the Khronos® Group. Other names and brands may be claimed as the property of others.

Itu tadi pembahasan mengenai CUDA, SYCL, Codeplay, dan oneAPI — Akselerator untuk semua | oleh TonyM | Juli 2022

, terimakasih telah mengunjungi website saya, mudah-mudahan artikelnya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.