CUDA.JL 5.6 dan 5.7: Distribusi Cublas dan Buffer Sinkronisasi – Beragampengetahuan
Oleh: Tim Besard
Re -Post dari:
CUDA.JL v5.6 Dukungan tambahan untuk antarmuka alokasi buffer gpuarrays.jl baru, yang akan meningkatkan kinerja aplikasi memori yang berat dan berat. CUDA.JL V5.7 membawa banyak perbaikan CuRef Ketik, memungkinkan panggilan cublas tidak disinkronkan sepenuhnya asinkron.
Contents
Mengulangi CuRef Untuk cublas asinkron
Itu CuRef Ketik Mirip dengan Julia RefNilai kalengan, sering digunakan dengan API. Di Cuda.jl v5.7, kami membuat beberapa perubahan pada jenis ini. Pertama -tama, kami telah mengaitkan API untuk lebih dekat Ref Ketik dari pangkalan, misalnya, tambahkan getindex Dan setindex! Metode, akan membuatnya lebih akrab bagi pengguna:
julia> box = CuRef(1)
CuRefValue{Int64}(1)julia> box[]
1julia> box[] = 2
2julia> box
CuRefValue{Int64}(2)
Kami juga mengoptimalkan dan meningkatkan CuRef melakukan. Sebagai bagian dari pekerjaan itu, kami telah menghilangkan sinkronisasi yang bersemangat saat menyalin dari memori yang tidak tercapai. Ini telah dilakukan untuk membuat kode Julia dapat dilakukan saat menunggu salinan memori dimulai. Namun, ternyata salinan tertentu (kecil), seperti salinan yang dibuat oleh CuRefDapat dilakukan tanpa harus menunggu salinan awal. Dengan menghilangkan sinkronisasi yang bersemangat dari salinan itu, CuRef Subjek sekarang dapat dibangun sepenuhnya asinkron, yaitu, tanpa harus menunggu GPU siap.
Berdasarkan perubahan ini, @kkhyatt telah mentransfer cublas kami untuk digunakan berdasarkan GPU. CuRef Kotak untuk input terorganisir alih -alih server Ref Kotak. Meskipun ini meningkatkan kompleksitas panggilan API cublas – CuRef Kotak membutuhkan panggilan CUA API sementara Ref Kotak ini jauh lebih murah untuk dialokasikan ini mengarah ke API asinkron, sementara sebelum setiap API Cublas mengambil input input, itu akan mengarah pada apa yang disebut “gelembung” menunggu GPU menyelesaikan implementasi.
Buffer alokasi level julia
Untuk membantu masalah umum adalah semua memori GPU atau untuk mengurangi biaya CUDA.JL secara teratur ke GC, @pxl-th telah menambahkan alokasi buffer yang dapat digunakan kembali ke gpuarrays.jl, yang saat ini didukung dan diintegrasikan oleh Cuda.
Idenya sangat sederhana: alokasi GPU dibuat dalam satu GPUArrays.@cached Blok ini direkam dalam satu cacheDan ketika blok melarikan diri, alokasi disediakan untuk digunakan kembali. Hanya saat buffer di luar ruang lingkup, atau saat Anda menelepon unsafe_free! Di atasnya, alokasi akan sepenuhnya dirilis. Ini sangat berguna ketika Anda telah mengulangi volume kerja yang dilakukan bersama berkali -kali, seperti dalam putaran pelatihan mesin:
cache = GPUArrays.AllocCache()
for epoch in 1:1000
GPUArrays.@cached cache begin
# dummy workload
sin.(CUDA.rand(Float32, 1024^3))
end
end# wait for `cache` to be collected, or optionally eagerly free the memory
GPUArrays.unsafe_free!(cache)
Meskipun CUDA memiliki alokasi bantal, mekanisme bantal tingkat Julia masih dapat meningkatkan kinerja dengan mengurangi tekanan pada GC dan mengurangi fragmentasi alokasi dasar. Misalnya, kutipan di atas hanya melakukan dua alokasi memori membutuhkan 8 GIB, bukannya alokasi 2000 8 tib (!) Dari memori GPU.
Cherry di bagian atas adalah antarmuka buffer umum, digunakan di gpuarrays.jl dan tersedia untuk semua bagian belakang ujung GPU yang kompatibel dengan v11.2.
Perubahan kecil
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#CUDA.JL #dan #Distribusi #Cublas #dan #Buffer #Sinkronisasi