2011-07-13 10 views
7

GPU'ların eşitlemeyi nasıl gerçekleştirdiği hakkında bazı sorularım var. Bildiğim kadarıyla, bir warp bir bariyerle karşılaştığında (OpenCL'de olduğu varsayılarak), ve aynı grubun diğer çözgülerinin henüz orada bulunmadığını biliyor. Yani beklemek zorunda. Ama bu çözgü bekleme süresi boyunca tam olarak ne yapıyor? Hala aktif bir çözgü mü? Yoksa bir çeşit boş operasyon yapacak mı?GPU'lardaki Senkronizasyonlar

Fark ettiğim gibi, çekirdekte bir senkronizasyon olduğunda, talimatların sayısı artar. Bu artışın kaynağı nedir acaba? Senkronizasyon çok daha küçük GPU komutlarına ayrıldı mı? Ya da boşta olan çözgülerin bazı ekstra talimatlar yapması nedeniyle mi?

Ve son olarak, senkronizasyon olmadan bir eşitleme ile eklenen maliyetin (bir bariyerin (CLK_LOCAL_MEM_FENCE)) bir çalışma grubundaki (veya iş parçacığının) warp sayısından etkilenip etkilenmediğini merak ediyorum. Teşekkürler

cevap

7

Aktif bir çözgü, SM'de yerleşik olan bir örnektir, yani tüm kaynaklar (kayıtlar vb.) Ayrıldı ve çözgü, programlanabilir olmasını sağlayarak yürütme için kullanılabilir. Eğer bir çözgü aynı threadblock/work-grubunda diğer warpslerden önce bir bariyere ulaşırsa, hala aktif olacaktır (hala SM'de yerleşiktir ve tüm kayıtları hala geçerlidir), ancak herhangi bir talimatı yürütmeyecektir. planlanmaya hazır değil.

Bir bariyer eklemek yalnızca çalışmayı durdurmaz, aynı zamanda derleyici için bir engel görevi de görür: derleyicinin bariyerin tamamında çoğu optimizasyonu gerçekleştirmesine izin verilmez, çünkü bu durum bariyerin amacını geçersiz kılabilir. Bu, daha fazla talimat görmenin en muhtemel sebebidir - engelleyici daha fazla optimizasyon gerçekleştirebiliyor.

Bir bariyerin maliyeti, kodunuzun yaptıklarına çok bağlıdır, ancak her bir engel, tüm çözgülerin tekrar çalışmaya başlamadan önce (etkin bir şekilde) boşta kaldığı bir balon oluşturur./iş grubu daha sonra elbette küçük bir bloktan daha büyük bir kabarcık var. Kabarcıkın etkisi kodunuza bağlıdır - eğer kodunuz çok hafızalıysa, o zaman bariyer bellek gecikmelerini gizlenmeden önce gösterecektir, ancak daha dengeli ise daha az fark edilir bir etkiye sahip olabilir.

Bu, çok belleğe bağlı bir çekirdekte, daha büyük sayıda küçük blok başlatmanın daha iyi olabileceği anlamına gelir; böylece, bir blok bir engelin üzerinde kabarcık kaldığında diğer bloklar çalıştırılabilir. Sonuç olarak doluluk oranınızın arttığından emin olmanız gerekir ve blok paylaşımlı bellek kullanan thread'ler arasında veri paylaşıyorsanız, o zaman bir takas işlemi gerçekleşir.

+0

Detaylı yanıt için teşekkürler. Bilgiyi aldığın bazı belgeleri paylaşırsan hoş olur. Araştırmamda alıntı yapmak istiyorum. Belleğe bağlı çekirdeklerin neden bellek gecikmelerini açığa çıkardığını açıklayabilir misiniz? Şimdi anladığım gibi, bir bilgi işlemine göre gizlenmesi gereken bir eşitleme (senkronizasyondan önce beliren) için bir bellek isteği, veriler elde edilene kadar durur. Doğru mu? Öte yandan, çekirdek memel değil ise, bir senkronizasyon ne ortaya çıkıyor? yönlendirme boru hattı gecikmesi? (herhangi bir sapma olmadığı varsayıldı, ve evet bütün bunlar sapmalar ile ne yapıyor?) – Zk1001