GPU Drano adalah alat analisis statis untuk program GPU. Salah satu analisis dalam drano GPU adalah untuk menemukan akses memori yang tidak dikoordinasikan dalam kode CUDA. Analisis lain yang didukung oleh GPU Drano adalah analisis untuk membuktikan independensi blok program GPU.
Benang bundel GPU modern menjadi lungsin. Semua utas dalam operasi melakukan warp di lockstep. Akses memori ke lokasi memori yang berbeda dapat digabungkan menjadi satu beban/penyimpanan jika memori berdekatan atau cukup dekat dalam memori. Ketika memori yang diakses oleh warp berjauhan, banyak beban/toko diperlukan untuk menyelesaikan transaksi memori, dan kami mengatakan aksesnya tidak dikoaduksi .
Kernel GPU dikatakan independen , jika memodifikasi ukuran blok sambil menjaga jumlah total utas yang sama, tidak merusak fungsionalitas program. Ini penting untuk penyetelan ukuran blok yang benar dalam program GPU, yang sering digunakan untuk meningkatkan kinerja program.
Kami juga telah mengimplementasikan analisis dinamis untuk mengidentifikasi akses yang tidak terkoal, tersedia di repositori ini.
GPU Drano diimplementasikan sebagai pass kompiler untuk LLVM menggunakan implementasi CUDA open source Google: gpucc . Oleh karena itu, drano ditambah dengan rapat dengan LLVM.
Drano membutuhkan LLVM versi 6.0 atau lebih baru. Ini juga membutuhkan CUDA Toolkit (versi 7.5 atau lebih baru) dari NVIDIA. Ini telah diuji pada Ubuntu 16.04 LTS, tetapi harus bekerja dengan sebagian besar sistem Linux yang ada.
Analisis statis itu sendiri tidak memerlukan GPU. Namun untuk menjalankan program dan menjalankan anlaysis dinamis, diperlukan GPU NVIDIA dan driver yang kompatibel. Periksa persyaratan sistem NVIDIA untuk informasi lebih lanjut.
Rincian algoritma dan pilihan desain dapat ditemukan di makalah berikut:
Script installnrun.sh disertakan dengan detail proyek Langkah -langkah yang diperlukan untuk membangun dan menjalankan GPU Drano pada sistem Ubuntu. Untuk menjalankan skrip,
ROOT_DIR ke jalur ke folder yang diunduh.sh installnrun.shIni akan secara otomatis menginstal GPU Drano pada sistem Linux. Kami lebih lanjut menjelaskan langkah -langkah instalasi untuk menginstal analisis akses yang tidak dikoaduksi di sini. Instalasi untuk analisis independensi ukuran blok (juga disebut sebagai analisis invarian ukuran blok) dapat dilakukan dengan cara yang sama.
Dapatkan Sumber LLVM:
Pastikan subversion diinstal. Unduh LLVM versi terbaru:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
Dapatkan sumber dentang:
Ubah direktori kerja Anda saat ini ke llvm/tools/ dan periksa clang dari repositori SVN:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
Tambahkan GPU Drano ke LLVM:
Salin src/ folder GPU Drano ke dalam direktori llvm/lib/Transforms/UncoalescedAnalysis dalam kode sumber Anda:
cp -r src/abstract-execution/* llvm/lib/Transforms/UncoalescedAnalysis
cp -r src/uncoalesced-analysis/* llvm/lib/Transforms/UncoalescedAnalysis
Ini akan membuat folder yang disebut llvm/lib/Transforms/UncoalescedAnalysis/ . Kita harus mendaftarkan pass kita dengan sistem pembuatan LLVM, cmake . Oleh karena itu, tambahkan add_subdirectory(UncoalescedAnalysis) ke llvm/lib/Transforms/CMakeLists.txt
Contoh file cmakelists.txt:
$> more CMakeLists.txt
add_subdirectory(Utils)
add_subdirectory(Instrumentation)
add_subdirectory(InstCombine)
add_subdirectory(Scalar)
add_subdirectory(IPO)
add_subdirectory(Vectorize)
add_subdirectory(Hello)
add_subdirectory(ObjCARC)
add_subdirectory(Coroutines)
add_subdirectory(UncoalescedAnalysis)
Bangun LLVM dan GPU Drano:
Dari direktori root Drano, buat build/ Directory. Kemudian, ubah direktori ke build/ direktori. Pastikan CMake diinstal pada sistem. Jalankan perintah berikut di sini:
cmake ../llvm
make
Itu cmake dengan jalur ke direktori llvm ( ../llvm ). CMake Mengkonfigurasi LLVM untuk sistem Anda. Ini harus menghasilkan beberapa file di direktori kerja Anda saat ini ( build/ ). Perintah make build LLVM dan Drano.
Idealnya, gunakan make -j N di mana n adalah jumlah inti Anda untuk dibangun secara paralel karena LLVM membutuhkan waktu lama untuk dibangun.
Perhatikan : LLVM Build membutuhkan sejumlah besar memori untuk dikompilasi, khususnya pada langkah penghubung. Jika Anda memiliki <8 gigabytes RAM, LLVM mungkin gagal membangun. Jika demikian, Anda dapat make kembali tanpa opsi -j . Ini hanya akan mengkompilasi ulang bagian -bagian yang gagal dari build, dan masih menghemat lebih banyak waktu daripada tidak menggunakan -j dari awal.
Instal LLVM dan GPU Drano Lakukan sudo make install . Ini harus menginstal pustaka dan binari di lokasi default (atau lokasi yang ditentukan). Jika diinstal secara lokal, panduan ini mengasumsikan Bash dapat menemukan perintah di jalurnya.
Di atas adalah panduan awal yang cepat. Jika Anda tidak terbiasa dengan LLVM, Anda dapat menemukan semua detail untuk instalasi di: http://llvm.org/docs/gettingstarted.html
Script installnrun.sh secara singkat menjelaskan proses untuk membangun driver nvidia, toolkit, dan SDK. Script telah dikomentari untuk menghindari risiko mengesampingkan pengemudi NVIDIA yang ada. Perhatikan bahwa kami hanya membutuhkan toolkit dan SDK untuk menjalankan analisis statis. Kami juga membutuhkan driver dan GPU yang berfungsi untuk menjalankan analisis dinamis dan program CUDA sendiri.
Instal driver NVIDIA, CUDA Toolkit dan SDK: Silakan merujuk ke Panduan Instalasi NVIDIA untuk instruksi.
Singkatnya, jika Anda menggunakan distro Linux terbaru dan populer, Anda harus dapat menggunakan alat unduhan otomatis untuk menginstal driver dan SDK yang diperlukan.
Jika Anda sudah memiliki driver yang diperlukan dan SDK yang diinstal, Anda dapat melewatkan langkah ini. Mungkin bukan ide yang baik untuk mengesampingkan driver Anda yang ada karena ini mungkin membuat sistem Anda tidak dapat digunakan.
Anda mungkin memerlukan G ++-multilib untuk menginstal pustaka yang diperlukan yang diperlukan oleh clang .
Langkah ini opsional . Program CUDA sederhana seperti "Hello World" sekarang harus dikompilasi menggunakan clang atau clang++ :
clang -x cuda helloWorld.cu
Opsi -x cuda secara eksplisit menyatakan bahasa. Anda dapat menghilangkannya juga dan dentang akan menyimpulkan ini sebagai program CUDA.
Perhatikan: Instalasi dentang Anda mungkin tidak perlu dapat menemukan beberapa fungsi LLVM internal, jika demikian, Anda mungkin perlu menyertakan -lcudart . Anda mungkin juga perlu menunjuk ke lokasi cudart.so .
Contoh:
clang -x cuda -L /usr/local/cuda/targets/x86_64-linux/lib/ -lcudart helloWorld.cu
Jalur ke cudart Anda . Jadi mungkin berbeda tergantung pada sistem Anda.
LLVM seharusnya menghasilkan objek bersama .so file, yang disebut LLVMUncoalescedAnalysis.so , di bawah Direktori build/lib/ .
LLVM Compier clang menghasilkan perangkat terpisah (kode kernel GPU) dan host (kode yang dijalankan pada CPU) file IR saat menyusun program CUDA. GPU Drano menganalisis file IR LLVM untuk kode perangkat.
Sebagai contoh, mari kita analisis kode kernel Rodinia untuk tolok ukur gaussian . Kami mengubah direktori menjadi rodinia_3.1/cuda/gaussian/ .
Pertama, kami telah menghasilkan file LLVM IR untuk kode yang kami minati:
clang++ -S -g -emit-llvm gaussian.cu
Perhatikan kami menyusun dengan simbol debug -g , untuk menjaga informasi debug tentang lokasi kode sumber di IR yang dihasilkan. Ini digunakan untuk menunjukkan lokasi kode sumber dengan akses potensial yang tidak dikoaduksi dari LLVM IR.
Kompilasi menghasilkan dua file:
gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll
gaussian.ll
Kami kemudian dapat menjalankan analisis statis melalui LLVM's opt dengan menentukan jalur ke Biner Drano GPU dan menentukan lulus -interproc-uncoalesced-analysis yang akan dijalankan. Pass ini adalah analisis interprocedural untuk mendeteksi akses yang tidak dikoaduksi. Dimulai dengan analisis fungsi paling atas dalam grafik panggilan dan kemudian dilanjutkan dengan analisis callees dalam urutan topologis. Saat menganalisis callee tertentu, ia mempertimbangkan gabungan konteks panggilan dari semua peneleponnya. Untuk menjalankan analisis intraprocedural (yang mengasumsikan semua argumen fungsi awal tidak tergantung pada ID utas), tentukan lulus -uncoalesced-analysis untuk dijalankan, bukan -interproc-uncoalesced-analysis .
opt -load ../../../build/lib/LLVMUncoalescedAnalysis.so -instnamer -interproc-uncoalesced-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
Perhatikan opt membaca file IR dari input standar. opt menulis output tanpa menarik sendiri ke Standard Out sehingga kami mengarahkan ulang ke /dev/null GPU Drano output ditulis untuk kesalahan standar yang dapat dialihkan ke file.
Untuk menghasilkan hasil analisis verbose (LLVM IR dianotasi dengan info analisis), jalankan opt dengan tambahan -debug-only=uncoalesced-analysis .
Perintah berikut dapat digunakan untuk menjalankan analisis independensi ukuran blok pada suatu program.
opt -load ../../../build/lib/LLVMBlockSizeInvarianceAnalysis.so - -instnamer -always-inline -interproc-bsize-invariance-analysis < gaussian-cuda-nvptx64-nvidia-cuda-sm_20.ll > /dev/null 2> gpuDranoResults.txt
Hasil yang dihasilkan untuk analisis akses yang tidak dikoaduksi melaporkan semua akses yang mungkin berpotensi tidak dikoaduksi di masing -masing kernel GPU. Misalnya, berikut adalah hasil untuk analisis gaussian.cu .
Analysis Results:
Function: _Z4Fan1PfS_ii
Uncoalesced accesses: #2
-- gaussian.cu:295:59
-- gaussian.cu:295:61
Analysis Results:
Function: _Z4Fan2PfS_S_iii
Uncoalesced accesses: #4
-- gaussian.cu:312:38
-- gaussian.cu:312:35
-- gaussian.cu:312:35
-- gaussian.cu:317:23
Setiap item hasil menunjuk ke akses yang berpotensi tidak terkoalisasi dalam kode sumber. Misalnya, akses ke m_cuda di baris 295, kolom 59 di Gaussian.cu di Metode Fan1() tidak dikoaduksi.
Demikian pula, hasil yang dihasilkan untuk analisis independensi ukuran blok mengidentifikasi semua kernel yang independen ukuran blok!
Rodinia adalah rangkaian benchmark populer dari program GPU yang terdiri dari 22 program dari berbagai domain. Kami menganalisis suite dan menemukan 111 akses nyata yang tidak dikoaduksi menggunakan analisis statis. Untuk mereproduksi hasilnya, berikut adalah langkah -langkah yang terlibat:
Perbarui Konfigurasi Cuda dan Drano di rodinia_3.1/common/make.config . Atur CUDA_DIR dan SDK_DIR dengan NVIDIA Toolkit dan jalur SDK. Perbarui alias opt dengan jalur ke GPU Drano Binary LLVMUncoalescedAnalysis.so .
Pergi ke Benchmark Directory rodinia_3.1/cuda .
Kompilasi tolok ukur:
sh compile.sh
sh run-analysis.sh
Analisis setiap benchmark menghasilkan hasil di folder masing-masing di log-file bernama log_<filename> .
./summarize-results.sh
NVIDIA menyediakan satu set sampel CUDA yang dapat digunakan untuk berbagai aplikasi. Kami menganalisis suite untuk mengidentifikasi kernel independen ukuran blok dalam sampel. Untuk mereproduksi hasilnya, langkah -langkahnya adalah:
Perbarui variabel HOME di NVIDIA_CUDA-8.0_Samples/common/drano.mk ke direktori drano GPU root.
Instal OpenGL (diperlukan untuk menyusun beberapa tolok ukur). Di Ubuntu, perintah berikut dapat digunakan:
sudo apt-get install freeglut3-dev
Pergi ke direktori NVIDIA_CUDA-8.0_Samples
Kompilasi tolok ukur:
sh compile.sh
sh run-analysis.sh
Analisis setiap benchmark menghasilkan hasil di folder masing-masing di log-file bernama log_<filename> .
./summarize-bsize-independence.sh