CUDA'yı birkaç haftadır kullanıyorum, ancak blok / çözgü / iplik tahsisi konusunda bazı şüphelerim var. Mimarlığı didaktik bir bakış açısıyla inceliyorum (üniversite projesi), bu yüzden en yüksek performansa ulaşmak endişem değil.
Her şeyden önce, bu gerçekleri doğru bir şekilde anladım:
Programcı bir çekirdek yazar ve yürütülmesini bir iplik blokları ızgarasında düzenler.
Her blok bir Akış Çoklu İşlemcisine (SM) atanır. Atandıktan sonra başka bir SM'ye taşınamaz.
Her SM kendi bloklarını Bükülmelere böler (şu anda maksimum 32 iş parçacığı ile). Bir çözgüdeki tüm iplikler SM'nin kaynakları üzerinde eşzamanlı olarak yürütülür.
Bir iş parçacığının gerçek yürütülmesi SM'de bulunan CUDA Çekirdekleri tarafından gerçekleştirilir. İplikler ve çekirdekler arasında belirli bir eşleme yoktur.
Bir çözgü 20 iplik içeriyorsa, ancak şu anda sadece 16 çekirdek varsa, çözgü çalışmaz.
Öte yandan, bir blok 48 iş parçacığı içeriyorsa, 2 çözgüye bölünür ve yeterli bellek olması koşuluyla paralel olarak yürütülür.
Bir iş parçacığı bir çekirdeğe başlarsa, bellek erişimi veya uzun bir kayan nokta işlemi için durdurulursa, yürütülmesi farklı bir çekirdeğe devam edebilir.
Onlar doğru mu?
Şimdi, bir GeForce 560 Ti var, bu yüzden her biri 48 CUDA çekirdeği (toplam 384 çekirdek) içeren 8 SM ile donatılmış.
Amacım mimarinin her çekirdeğinin AYNI talimatları yürütmesini sağlamak. Kodumun her SM'de mevcut olanlardan daha fazla kayıt gerektirmeyeceğini varsayarsak, farklı yaklaşımlar hayal ettim:
Her SM'nin yürütmek için 1 bloğu olması için her biri 48 iş parçacığından 8 blok oluşturuyorum. Bu durumda 48 iş parçacığı SM'de paralel olarak yürütülür (onlar için mevcut 48 çekirdeğin tümünü kullanır)?
6 yivden 64 blok başlatırsam herhangi bir fark var mı? (SM'ler arasında eşit olarak eşleneceklerini varsayarsak)
GPU'yu planlanan çalışmalara "batırırsam" (örneğin her biri 1024 ipliklik 1024 blok oluşturarak) tüm çekirdeklerin belirli bir noktada kullanılacağını ve aynı hesaplamaları gerçekleştireceğini varsayarsak (iş parçacıklarının asla durmaz)?
Profil oluşturucuyu kullanarak bu durumları kontrol etmenin bir yolu var mı?
Bu şeyler için herhangi bir referans var mı? CUDA Programlama kılavuzunu ve "Devasa Paralel İşlemcileri Programlama" ve "CUDA Uygulama tasarımı ve geliştirme" bölümündeki donanım mimarisine ayrılmış bölümleri okudum; ama kesin bir cevap alamadım.