Saya telah menggunakan CUDA selama beberapa minggu, tetapi saya memiliki keraguan tentang alokasi blok / warps / utas. Saya mempelajari arsitektur dari sudut pandang didaktik (proyek universitas), jadi mencapai kinerja puncak bukan urusan saya.
Pertama-tama, saya ingin memahami jika saya mengemukakan fakta-fakta ini:
Programmer menulis kernel, dan mengatur pelaksanaannya dalam kotak blok thread.
Setiap blok ditugaskan ke Streaming Multiprocessor (SM). Setelah ditugaskan itu tidak dapat bermigrasi ke SM lain.
Setiap SM membagi bloknya sendiri menjadi Warps (saat ini dengan ukuran maksimum 32 utas). Semua utas dalam warp dieksekusi bersamaan pada sumber daya SM.
Eksekusi aktual sebuah thread dilakukan oleh CUDA Cores yang terkandung dalam SM. Tidak ada pemetaan khusus antara utas dan inti.
Jika sebuah warp berisi 20 utas, tetapi saat ini hanya ada 16 core yang tersedia, warp tidak akan berjalan.
Di sisi lain, jika sebuah blok berisi 48 utas, ia akan dibagi menjadi 2 lungsin dan akan dieksekusi secara paralel asalkan tersedia cukup memori.
Jika sebuah thread dimulai pada sebuah core, maka itu macet untuk akses memori atau untuk operasi floating point yang panjang, pelaksanaannya dapat dilanjutkan pada core yang berbeda.
Apakah mereka benar
Sekarang, saya memiliki GeForce 560 Ti sehingga sesuai dengan spesifikasi dilengkapi dengan 8 SM, masing-masing berisi 48 core CUDA (total 384 core).
Tujuan saya adalah memastikan bahwa setiap inti arsitektur mengeksekusi instruksi SAMA. Dengan asumsi bahwa kode saya tidak akan memerlukan lebih banyak register daripada yang tersedia di setiap SM, saya membayangkan pendekatan yang berbeda:
Saya membuat 8 blok dari 48 utas masing-masing, sehingga setiap SM memiliki 1 blok untuk dieksekusi. Dalam hal ini akankah 48 thread dieksekusi secara paralel di SM (mengeksploitasi semua 48 core yang tersedia untuk mereka)?
Apakah ada perbedaan jika saya meluncurkan 64 blok dari 6 utas? (Dengan asumsi bahwa mereka akan dipetakan secara merata di antara SM)
Jika saya "menenggelamkan" GPU dalam pekerjaan terjadwal (membuat 1024 blok masing-masing 1024 utas, misalnya) apakah masuk akal untuk menganggap bahwa semua inti akan digunakan pada titik tertentu, dan akan melakukan perhitungan yang sama (dengan asumsi bahwa utas tidak pernah warung)?
Apakah ada cara untuk memeriksa situasi ini menggunakan profiler?
Apakah ada referensi untuk barang ini? Saya membaca panduan Pemrograman CUDA dan bab-bab yang didedikasikan untuk arsitektur perangkat keras dalam "Pemrograman Proses Masif Paralel" dan "Desain dan pengembangan aplikasi CUDA"; tetapi saya tidak bisa mendapatkan jawaban yang tepat.