CUDA blokları / çözgüleri / iplikleri CUDA çekirdeklerine nasıl eşler?


143

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:

  1. Programcı bir çekirdek yazar ve yürütülmesini bir iplik blokları ızgarasında düzenler.

  2. Her blok bir Akış Çoklu İşlemcisine (SM) atanır. Atandıktan sonra başka bir SM'ye taşınamaz.

  3. 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.

  4. 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.

  5. Bir çözgü 20 iplik içeriyorsa, ancak şu anda sadece 16 çekirdek varsa, çözgü çalışmaz.

  6. Ö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.

  7. 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:

  1. 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)?

  2. 6 yivden 64 blok başlatırsam herhangi bir fark var mı? (SM'ler arasında eşit olarak eşleneceklerini varsayarsak)

  3. 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)?

  4. Profil oluşturucuyu kullanarak bu durumları kontrol etmenin bir yolu var mı?

  5. 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.


Yorum olarak "CUDA çekirdeği" ne eklemek istiyorum. "CUDA çekirdeği" veya "Yürütme birimi", bir cuda iş parçacığında saat döngüsü başına bir aritmetik komut talimatını yürüten tamamen boru hatlı tam sayı ALU ve FPU'dur.
bruziuz

Yanıtlar:


123

En iyi referanslardan ikisi

  1. NVIDIA Fermi Bilişim Mimarisi Teknik İncelemesi
  2. GF104 Yorumlar

Her bir sorunuza cevap vermeye çalışacağım.

Programcı işi dişlere, dişleri iplik bloklarına ve iplik bloklarını ızgaralara böler. Hesaplama iş dağıtıcısı, Akış Çoklu İşlemcilere (SM) iş parçacığı blokları ayırır. Bir iş parçacığı bloğu bir SM'ye dağıtıldığında, iş parçacığı bloğunun kaynakları ayrılır (çözgü ve paylaşılan bellek) ve iş parçacıkları çözgü adı verilen 32 iş parçacığına ayrılır. Bir çözgü tahsis edildikten sonra buna etkin çözgü denir. İki çözgü programlayıcı, döngü başına iki etkin çözgü seçer ve yürütme birimlerine çözgü gönderir. Yürütme birimleri ve komut dağıtımı hakkında daha fazla bilgi için bkz. 1 s.7-10 ve 2 .

4 ' . Şerit (bir çözgüde iplik dizini) ve bir çekirdek arasında bir eşleme vardır.

5' . Bir çözgü 32'den az iş parçacığı içeriyorsa, çoğu durumda 32 iş parçacığıyla aynı şekilde yürütülür. Çözgülerin birkaç nedenden ötürü 32'den az aktif iş parçacığı olabilir: blok başına iş parçacığı sayısı 32 ile bölünemez, program farklı bir blok yürütür, böylece geçerli yolu almayan iş parçacıkları etkin değil veya çözgüdeki bir iş parçacığı çıkar.

6 ' . Bir iş parçacığı bloğu WarpsPerBlock = (ThreadsPerBlock + WarpSize - 1) / WarpSize olarak bölünecektir Çözgü programlayıcılarının aynı iş parçacığı bloğundan iki çözgü seçmesine gerek yoktur.

7 ' . Bir yürütme birimi bellek işleminde durmaz. Bir talimat gönderilmeye hazır olduğunda bir kaynak kullanılamıyorsa, talimat ileride kaynak kullanılabilir olduğunda tekrar gönderilir. Çözgü, bariyerlerde, bellek işlemlerinde, doku işlemlerinde, veri bağımlılıklarında, durabilir ... Durmuş bir çözgü, çözgü zamanlayıcısı tarafından seçilemez. Fermi'de, döngü zamanlayıcının bir talimat verebilmesi için döngü başına en az 2 uygun çözgü elde etmek yararlıdır.

GTX480 ve GTX560 arasındaki farklar için referans 2'ye bakın .

Referans materyali okursanız (birkaç dakika), bence amacınızın mantıklı olmadığını göreceksiniz. Puanlarınıza cevap vermeye çalışacağım.

1 ' . Çekirdeği başlatırsanız <<< 8, 48 >>> Her biri 32 ve 16 iplik 2 çözgü ile 8 blok alacaksınız. Bu 8 bloğun farklı SM'lere atanacağının garantisi yoktur. Bir SM'ye 2 blok tahsis edilirse, her bir çözgü zamanlayıcısının bir çözgü seçmesi ve çözgüyü yürütmesi mümkündür. 48 çekirdeğin sadece 32'sini kullanacaksınız.

2 ' . 48 iplikten 8 blok ile 6 iplikten 64 blok arasında büyük bir fark vardır. Çekirdeğinizde farklılaşma olmadığını ve her bir iş parçacığının 10 talimat uyguladığını varsayalım.

  • 48 dişli 8 blok = 16 çözgü * 10 talimat = 160 talimat
  • 6 dişli 64 blok = 64 çözgü * 10 talimat = 640 talimat

Optimal verimlilik elde etmek için iş bölümü 32 iş parçacığının katları şeklinde olmalıdır. Donanım, farklı çözgü ipliklerini birleştirmeyecektir.

3 ' . Bir GTX560'ta 8 SM * 8 blok = bir seferde 64 blok veya 8 SM * 48 çözgü = 512 çözgü, çekirdeğin kayıtları veya paylaşılan belleği maksimize etmemesi durumunda olabilir. Herhangi bir zamanda işin bir bölümü SM'lerde aktif olacaktır. Her SM'nin birden fazla yürütme birimi vardır (CUDA çekirdeklerinden daha fazla). Herhangi bir zamanda hangi kaynakların kullanımda olduğu, çözgü programlayıcılarına ve uygulamanın talimat karışımına bağlıdır. TEX işlemlerini yapmazsanız, TEX birimleri boşta kalacaktır. Özel bir kayan nokta işlemi yapmazsanız SUFU üniteleri boşta kalır.

4 ' . Paralel Nsight ve Görsel Profiler gösterisi

a. yürütülen IPC

b. verilen IPC

c. aktif döngü başına aktif çözgü

d. her etkin döngü için uygun çözgü (sadece Nsight)

e. çözgü durak nedenleri (sadece Nsight)

f. yürütülen komut başına etkin iş parçacıkları

Profil oluşturucu, yürütme birimlerinin kullanım yüzdesini göstermez. GTX560 için kaba bir tahmin yayınlanacaktırIPC / MaxIPC. MaxIPC için GF100'ün (GTX480) 2 olduğunu varsayalım GF10x (GTX560) 4, ancak hedef 3'ün daha iyi bir hedef olduğunu varsayalım.


1
Cevabınız için teşekkür ederim. Referansları okudum, ama cevabında anlamadığım birkaç şey var. Aşağıdaki sorularda 48 çekirdekli (16 çekirdek * 3 "çekirdek grup") bir Fermi mimarisi kullandığımızı varsayıyorum: 1. Çekirdekler ve şerit arasındaki bir eşlemeden bahsettiniz. Ne tür bir harita? 2. Referanslardan, her bir "çekirdek grup" un saat döngüsü başına en fazla yarım çözgü (16 iplik) yürütmesini sağladım. Teoride, aynı blokta 48 iplik varsa, bunlar 3 yarım çözgü halinde organize edilecek ve 48 çekirdek üzerinde paralel olarak yürütülecektir. Haklı mıyım?
Daedalus

1
CUDA çekirdekleri tek hassas FP birimlerinin sayısıdır. Uygulamanın CUDA çekirdeği açısından düşünülmesi doğru değildir. Her çözgü 32 ipliğe sahiptir. Bu iplikler bir grup yürütme birimine (örneğin 16 cuda çekirdeği) verilecektir. 48 çekirdeğin hepsini tek bir saatte yayınlamak için, iki çözgü programlayıcıdan birinin süperskalar çiftin req'sini karşılayan bir çözgü seçmesi gerekir ve her iki yöntemin de CUDA çekirdeği tarafından yürütülen bir tipte olması gerekir. Ek olarak, diğer çözgü zamanlayıcı bir sonraki talimatı CUDA çekirdeği tarafından yürütülecek bir çözgü seçmelidir.
Greg Smith

1
Çözgülerin aynı blokta olması veya bir bloktaki çözgülerin aynı program sayacına sahip olmasına gerek yoktur.
Greg Smith

2
Örnekte her programlayıcı bir çözgü seçiyor ve 1 talimat veriyor. Bu durumda sadece 2 yürütme birimi grubu kullanılacaktır. Daha fazla yürütme birimi kullanabilmek için, zamanlayıcıların 1'inin iki sorunu vardır. Referanslarda belirtildiği gibi, birden fazla yürütme birimi türü vardır (sadece ne tür cuda çekirdekleri değil) ve zamanlayıcıların çift sayı vermesi için yerine getirilmesi gereken komut eşleştirme kuralları (iyi belgelenmemiş) vardır.
Greg Smith

1
@GregSmith Fermi mimarisinde SM başına bu 8 aktif bloğun nereden geldiğini öğrenmek için web'in her yerinde arama yapıyorum. Fermi tanıtım belgesinde bile belirtilmemiş. Bununla ilgili daha fazla referansınız var mı?
Greg K.

8

"E. Bir çözgü 20 iplik içeriyorsa, ancak şu anda sadece 16 çekirdek varsa, çözgü çalışmaz."

yanlış. Çekirdekleri her zamanki anlamıyla karıştırıyorsunuz (CPU'larda da kullanılıyor) - GPU'daki "çok işlemcili" sayısı, nVIDIA pazarlamadaki çekirdeklerle konuşuyor ("kartımızda binlerce CUDA çekirdeği var").

Bir çözgü yalnızca tek bir çekirdekte (= çok işlemcili) programlanabilir ve aynı anda 32 iş parçacığına kadar çalışabilir; tek bir çekirdekten fazlasını kullanamaz.

"48 çözgü" sayısı, Hesaplama Yeteneği 2.x'e sahip nVIDIA GPU'larda, çok işlemcili başına maksimum etkin çözgü sayısıdır (bir sonraki döngüde, herhangi bir döngüde çalışmak üzere planlanmak üzere seçilebilir); ve bu sayı 1536 = 48 x 32 dişe karşılık gelir.

Bu web seminerine dayanan yanıt


@GregSmith: Buna cevap vermek için cevabı düzenledi. Onunla sabırlı olmanız iyi, ama - beş yıl oldu ...
einpoklum

tek çekirdekli (= çok işlemcili)? Bence soru çok terimli değil, tek çekirdekli = işlemci terminolojisini varsayar. Terminolojinizle cevabınız doğru.
Adarsh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.