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ü
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
Ö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). –
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