2012-02-16 18 views
6

CUDA çekirdeği için farklı akışlar kullanmak eşzamanlı çekirdek yürütmeyi mümkün kılar. Bu nedenle, n akışlarında n akışları, donanımlara uyuyorsa teorik olarak eşzamanlı olarak çalışabilir, değil mi?CUDA Eşzamanlı çekirdek yürütme akışı başına birden çok çekirdekle yürütme

Şimdi şu sorunla karşılaşıyorum: n ayrı çekirdekler yok, ancak n*m, burada m kernellerin sırayla yürütülmesi gerekiyor. Örneğin n=2 ve m=3 için akış ile aşağıdaki yürütme Şema oluşmasına yol açacaktır:

Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>> 
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>> 

Benim saf varsayım çekirdekleri x.0 ve Y.1 en az (bir görüş teorik noktadan) eş zamanlı olarak çalıştırmak veya gerektiğidir ardışık olarak değil (pratik bir bakış açısından). Ancak ölçümlerim bana durumun böyle olmadığını gösteriyor ve ardışık yürütme gerçekleştiriliyor gibi görünüyor (yani K0.0, K1.0, K2.0, K0.1, K1.1, K2.1). Çekirdeklerin kendisi çok küçüktür, bu yüzden eşzamanlı yürütme bir sorun olmamalıdır.

Şimdi benim yaklaşımım, çekirdeklerin GPU'daki zamanlayıcıya bir araya getirilmiş bir tarzda en çok sıraya konmasını sağlamak için bir tür gönderim gerçekleştirmek olabilir. Fakat çok sayıda akarsu/çekirdekle uğraşırken, bu iyiden daha fazla zarar verebilir.

Tam olarak, şu noktaya gelin: Bu durumu çözmek için uygun (veya en azından farklı) bir yaklaşım ne olurdu?

Düzenleme: Ölçümler CUDA olayları kullanılarak yapılır. Hesaplamayı tam olarak çözmek için gereken zamanı ölçtüm. e. GPU'nun tüm n * m kernellerini hesaplaması gerekir. Varsayım şu şekildedir: Tam eşzamanlı çekirdek yürütme sırasında yürütme süresi kabaca (ideal olarak) tüm çekirdeklerin sırayla yürütülmesi için gereken sürenin 1/n katıdır, bu sayede eşzamanlı olarak iki veya daha fazla çekirdek gerçekleştirilebilir. Bunu şu anda yalnızca iki farklı akış kullanarak yapıyorum.

Tanımlandığı gibi akışları kullanma ve aralarına ayrılan çekirdekleri gönderme arasındaki yürütme süreleriyle ilgili net bir farkı ölçebilirim, i. E .:

Loop: i = 0 to m 
    EnqueueKernel(Kernel i.1, Stream 1) 
    EnqueueKernel(Kernel i.2, Stream 2) 

daha uzun çalışma zamanına ikincisi uçları

Loop: i = 1 to n 
    Loop: j = 0 to m 
     EnqueueKernel(Kernel j.i, Stream i) 

karşı.

Düzenleme # 2: (0 yerine aşağıdaki yorumlara bakınız) 1 ile başlaması Akış numaralarını değiştirdi.

Düzenleme # 3: Donanım NVIDIA Tesla M2090 (yani Fermi hesaplama yeteneği 2.0) Fermi günü

+0

Gereksinim duyduğunuz yürütme sırasını uygulamak için bazı akış eşitleme ilkellerini kullanmanız gerekebilir. Ancak, ölçümlerinizi sorgunuzda nasıl yaptığınıza birazcık katlanabilir misiniz? Ayrıca, "Stream 0" yazdığınızda, CUDA stream 0 anlamına gelmediğini de doğrulayabilir miydiniz? – talonmies

+0

Ölçümü açıklığa kavuşturdum (en azından umarım). Akımlarla [CUDA C Programlama Kılavuzu] 'nda açıklandığı gibi cudaStream_t' örneklerini kastediyorum (http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf), bölüm 3.2.5 (Eşzamansız Eşzamanlı Yürütme). –

+2

Belki de sorduğum şeyi yanlış anladınız - Yani akışlarınızdan biri CUDA akışı 0, çünkü akış 0 (varsayılan akış) senkrondir. – talonmies

cevap

5

(aka Compute Yeteneği 2.0) donanım o çekirdek için yerine birden akışlarına başlattı serpiştirmek için en iyisi tüm çekirdekleri bir akışa, sonra bir sonraki akışa, vb. başlatabilirsiniz. Bunun nedeni, donanımın yeterli kaynak varsa, derhal farklı akışlara çekirdekler başlatabileceğidir, buna karşılık gelen lansmanlar aynı akışa sahipse, sıklıkla eşzamanlılığı azaltarak gecikmeyi başlatır. İlk yaklaşımınızın daha iyi performans göstermesinin nedeni budur ve bu yaklaşım seçmeniz gereken bir yaklaşımdır.

Profil etkinleştirme, Fermi'deki eşzamanlılığı da devre dışı bırakabilir, bu yüzden dikkatli olun.Ayrıca, başlatma döngüsünüz sırasında CUDA olaylarını kullanmayla ilgili olarak dikkatli olun; çünkü bunlar, örneğin, yaptığınız gibi olayları kullanarak tüm döngüyü en iyi şekilde etkileyebilir.

+0

Bu bilginin (birinci paragrafta, ikinci değil) nereden geldiğini bana bir kaynak verebilir misiniz? –

+0

CUDA 4.1 Programlama Kılavuzunun 3. Bölümünde bilgi vardır. Ancak bunu okuduktan sonra açıkça "aralıklı kernel başlattı" demediğini görüyorum. NVIDIA CUDA yazılım ekibindeki meslektaşlarımdan bilgi aldım. – harrism

+0

Güncelleme için teşekkürler. Kodumu tekrar gözden geçireceğim ve mümkünse daha fazla bilgi/güncelleme sağlayacağım. –

İlgili konular