Bagaimana menjelaskan percepatan super-linear yang diamati pada perangkat GPU dengan kode CUDA?

Saya kesulitan memahami kinerja penskalaan komputasi paralel yang memalukan pada Tesla C1060. Menjalankannya menggunakan semua blok dan beberapa utas per blok, saya mendapatkan waktu proses sekitar 0,87 detik.

Namun, jika saya menjalankan semua iterasi hanya dalam satu blok dengan satu thread per blok, waktu proses hingga 1872 detik, yang jauh lebih lama daripada 240x0.87s = 209 detik yang saya harapkan dari hanya memperkecil menjadi hanya menggunakan satu dari 240 prosesor streaming.

Sebaliknya, dengan menggunakan seluruh 240 core sepertinya saya mendapatkan kecepatan lebih dari 2000x. Bagaimana percepatan super-linier ini bisa terjadi; faktor lain apa yang harus saya perhatikan dalam pemodelan kinerja sistem ini?


person Alaya    schedule 22.05.2014    source sumber
comment
Perihal: tutup suara - Saya pikir ini sebenarnya pertanyaan pemodelan kinerja yang cukup berguna untuk kode GPU; Saya sudah mencoba mengedit pertanyaan untuk memunculkannya lebih jelas.   -  person Jonathan Dursi    schedule 22.05.2014


Jawaban (1)


Meluncurkan kernel yang terdiri dari 1 thread membatasi eksekusi kernel menjadi 1 dari 30 SM. Untuk setiap instruksi warp yang dikeluarkan hanya 1/32 unit eksekusi yang akan digunakan. Selain itu, instruksi dari warp yang sama tidak dapat dikeluarkan pada slot terbitan yang berurutan, sehingga menyisakan setidaknya 1/2 slot terbitan kosong. Slot tambahan akan kosong untuk ketergantungan instruksi dan latensi memori sehingga mempercepat 2-4x. Anggap saja 2x pesimis banget. Perhitungan kasar tentang kemungkinan keuntungan adalah

30x increase for using all 30 SMs
32x increase for using full width of the execution units
 2x increase for using issue slots and saturating memory system
= 30 * 32 * 2
= >1920x performance increase

Anda melihat perbedaan 1872/.87 = 2152x. Hal ini dapat dengan mudah dijelaskan dengan >2x karena slot masalah kosong dan fakta bahwa 1 warp per SM tidak dapat memenuhi sistem memori.

person Greg Smith    schedule 22.05.2014
comment
Jadi, jika saya menjalankan program CUDA thread tunggal, apakah instruksi berikutnya tidak akan dikeluarkan sebelum instruksi saat ini selesai dijalankan? atau apakah ada paralelisme tingkat instruksi untuk program CUDA thread tunggal? - person Alaya; 24.05.2014