GPU programlama için itme kuvveti


10

Ben çok soru özellikle uygun değildir eğer öyleyse beni affet programlama GPGPU yeni. Anladığım kadarıyla GPU programlama, olağan CPU programlamasına kıyasla çok karmaşık bir mühendislik çalışmasıdır. Diverjans sorunları, döşeme, sabitlenmiş bellek tahsisi ve ana bilgisayar aygıt iletişimi / aygıt hesaplama çakışması konusunda çok dikkatli olmak gerekir.

Biraz araştırma yaptıktan sonra C ++ STL'yi taklit etmeye çalışan itme kütüphanesini buldum . Bu çok hoş. Ancak, çok sınırlı deneyimime ve iyi performans elde etmek için gerekli olan tüm mikro yönetimi gördükten sonra, performans konusunda biraz şüpheliyim. İtme, tüm karmaşık programlama parçasını dahili olarak etkin bir şekilde ele alabilir mi? PETSc gibi çok iyi bilinen bazı kütüphaneler, bir şekilde olması gerektiğine inanmamı sağlayan bu paketi kullanıyor gibi görünüyor.

CUDA ve itme konusunda daha fazla deneyime sahip olan kişilerin, düşük seviyeli CUDA programlamasına kıyasla paketin performansı hakkında bir iki kelime söyleyip söyleyemeyeceğini merak ediyordum. İtişi ne zaman kullanabilirim ve ne zaman CUDA'ya geri dönmeliyim?


ArrayFire'ı düşündünüz mü?
arrayfire

Yanıtlar:


2

İtme konusunda kişisel tecrübem yok, ancak neredeyse tüm detayları gizleyen başka bir üst düzey GPU kütüphanesi olan ViennaCL kullanıyorum. Kendi kişisel kıyaslamamda, gerçek hesaplamada 2x - 40x hızlanmalarını, bellekte hareket etmek için gereken zamanı görmezden gelirseniz görebilirim.

CPU'ya karşı itme ve CUDA'yı ne zaman kullanmanız gerektiği, çözdüğünüz soruna, yeteneğinize ve uygun zamanınıza bağlıdır. Göreceli performanslarını görmek için 3 yöntemle de basit problemleri çözerek başlamanızı tavsiye ederim. Daha sonra gerçek yazılımınızı hızlı bir şekilde yazabilir, kıyaslayabilir ve hızlandırılması gereken alanlarda uygun gpu yöntemini uygulayabilir, sadece birkaç dakika yürütme süresi kazandıracak CUDA yazılımı yazmak için zamanınızı boşa harcamayın .


Bu benim için çok mantıklı. Birinin her zaman önce profili olması gerekir. Örneğinizde, elde ettiğiniz hız, ViennaCL'yi kullanmaktı. Farkı kontrol etmek için doğrudan OpenCL denediniz mi?
mmirzadeh

Hayır, senin gibi GPU bilişimde yeniyim. Önümüzdeki bir ya da iki yıl içinde becerilerimi yavaş yavaş CUDA ve OpenCL içerecek şekilde genişletmeyi planlıyorum, ancak şu anda sadece kütüphaneyi kullanıyorum. ViennaCL belgeleri, muhtemelen başka bir 2x-10x siparişinde olacak şekilde ayarlanmış bir openCL uygulaması ile daha fazla hızlanmanın mümkün olacağını belirtiyor, ancak bellek bant genişliğinin odadaki performansınızı gerçekten tanımlayan 900 kiloluk goril olduğunu öğrendim.
Godric Seer

5

Bağlı küme genişletme projemde Thrust kullandım. Duruma bağlı olarak, Thrust kendinizi yuvarladığınız düşük seviyeli bir uygulama kadar iyi veya daha iyi performans gösterebilir (özellikle, reduceçekirdek benim için oldukça iyi çalışıyor). Bununla birlikte, Thrust'ın genel doğası ve esnekliği, bazen birkaç kötü kenar durumunda biraz yavaşlatabilecek birçok fazladan kopyalama, dizi dolgusu vb. Yapmak zorunda olduğu anlamına gelir. Son kullandığımda sortb40c veya mgpu gibi diğer kütüphanelere kıyasla oldukça yavaştı. Bununla birlikte, NVIDIA, Thrust'un algoritmik performansını iyileştirmek için çalışıyor, böylece gelecekte daha az sorun olabilir.

Kodunuzu hem Thrust hem de CUDA kullanarak yazmayı ve sonra ilgilendiğiniz belirli görev için hangisinin daha iyi olduğunu belirlemek için Visual Profiler'ı kullanmayı denemelisiniz. Bellek aktarımının programınızın en fazla çalışma süresini alacağını ve Kendi çeklerinizi banka çatışmaları, talimat sayısı vb. için optimize etme konusunda endişelenmek istemiyorsanız Thrust'u kullanırım. Ayrıca, GPU programlamaya aşina olmayan insanlar için kodunuzu daha az ayrıntılı ve daha kolay hale getirmenin yan yararı da vardır.


3

İtme amacı (çoğu şablon kütüphanesinde olduğu gibi), iyi veya hatta mükemmel performansı korurken yüksek düzeyde bir soyutlama sağlamaktır.

Performans konusunda fazla endişelenmemenizi, kendinize şunu sormanızı öneririm

  • uygulamanız itme sırasında uygulanan algoritmalar ve

  • belirli bir donanım / yazılım mimarisi ile verimli bir eşleme bulmaya gerek kalmadan, "genel" paralel kod yazma olasılığından hoşlanıyorsunuz.

Her iki soruya da olumlu yanıt verirseniz, programınızı yalnızca CUDA uygulamasıyla ilgili daha az çabayla uygulayabilmeniz gerekir. Ardından, uygulamanızı profili belirleyebilir ve performansı artırmaya çalışmanın faydalı olup olmadığına karar verebilirsiniz.

Bu, "genel" programlamayı sevmediğimi itiraf etmeliyim, çünkü bir program yazarken yeni bir şey öğrenmeye hazırım. Başka bir yol izlerdim: python + numpy + scipy'de bir prototip uygulaması yazın, sonra gerçekten optimizasyona ihtiyaç duyan ve bir GPU'da çalıştırılmaya uygun olan kodun% 1 -% 2'si için CUDA çekirdekleri ekleyin. Elbette bunu yaparak bir tür ön bilime ihtiyacınız vardır, çünkü prototipleme aşamasında yanlış bir karar (örneğin, CUDA çekirdekleri için uygun olmayan bir veri yapısı) performans üzerinde korkunç sonuçlar doğurabilir. Genellikle iyi bir kod elde etmek için daha fazla tekrarlamaya ihtiyaç vardır ve itme işleminden daha iyi yapmanın bir garantisi yoktur.

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.