CUDA vs OpenCL 2013 sonundan itibaren


34

CUDA ve OpenCL, 2013 sonu itibariyle birbirleriyle nasıl bir programcının bakış açısından karşılaştırılır? Grubum GPU hesaplamayı kullanmaya çalışmayı düşünüyor. Yalnızca OpenCL'i destekleyen, ancak CUDA'yı destekleyen bir donanım seçerek kendimizi önemli ölçüde sınırlıyor muyuz?

Daha spesifik olmak gerekirse, aşağıdaki varsayımlar doğru mu?

  • CUDA'da mümkün olan her şey OpenCL'de de mümkündür

  • Kütüphaneleri kullanmadığımız sürece, verilen bir görevin ikisinde de yapılması çok kolay değildir (veya daha zor).

  • CUDA'nın asıl avantajı kütüphanelerin mevcudiyetidir

  • Her ikisi de üç ana platform için de iyi bir desteğe sahip (Win / OSX / Linux)


1
Yeterince kesin değilse soruyu güncellemeye çalışacağım ... bu etki alanında yeniyiz ve bu, özellikle donanım seçimi nedeniyle ortaya çıkan temel sorulardan biri. Dikkatimi çeken ve beni OpenCL konusunda temkinli yapan şeylerden biri de bu konu . OpenCL ışın izleme için yeterince iyi değilse (Blender), HPC için de yeterince iyi değil ...
Szabolcs

2011'den beri GPU'larda aktif olmadım, bu yüzden birinin daha güncel cevap vermesine izin vereceğim, ancak "belirli bir işin ikisinde de yapılması kolay değil" ifadesi hiç doğru. Burada kişisel önyargılar var, ancak CUDA'nın geliştirme kolaylığı açısından OpenCL'den mil uzakta olduğunu hissettim. Kendimi güncellemek zorunda kalacaktım, ama bana 2 yıl önce sorarsanız, 10 ayak direği ile OpenCL'e dokunmayacağımı söylerdim.
Aurelius

Bu sorunun farkındayım: OpenCL'in Geleceği , ama tam olarak aynı soru değil ve 2 yaşında. İki yılda bazı şeylerin değişebileceğini varsayıyorum.
Szabolcs

Bizim için pratik sorulardan biri, AMD FirePro kartlarına sahip bir 2013 Mac Pro'nun GPU hesaplamayı tanımak ve kullanmak için iyi olup olmadığıdır (CUDA desteği yoktur).
Szabolcs

C ++ AMP'yi de radarınızda tutmak faydalı olabilir. Bir llvm uygulaması işlerde. hsafoundation.com/bringing-camp-beyond-windows-via-clang-llvm . Microsoft zaten FFT, BLAS ve LAPACK için C ++ AMP kitaplıkları oluşturdu.
Roger Dahl,

Yanıtlar:


37

CUDA ve OpenCL'in çok fazla bilgi işlem çekirdeğinin 1: 1 çevirisiyle geri döndüğü ViennaCL geliştirme sürecinde edindiğim deneyimlerimi özetlemeye çalışacağım. Sorunuzdan, burada daha çok GPU aldığımızı varsayacağım.

Performans Taşınabilirliği.Her şeyden önce, bir kez bir çekirdek yazmanız ve performansın her donanım üzerinde verimli bir şekilde çalışacağı anlamında performansa sahip çekirdekler diye bir şey yoktur. Desteklenen daha geniş donanım yelpazesi nedeniyle daha belirgin olduğu OpenCL’de değil, aynı zamanda CUDA’da da değil. CUDA'da desteklenen daha küçük donanım yelpazesi nedeniyle daha az belirgindir, ancak burada bile en az üç donanım mimarisini (Fermi, Fermi, Kepler öncesi) ayırt etmek zorundayız. Bu performans dalgalanmaları, çekirdek bir arabellek kopyası kadar basit olsa bile, dişleri nasıl düzenlediğinize ve hangi çalışma grubu boyutlarını seçtiğinize bağlı olarak yüzde 20'lik bir performans değişikliğine neden olabilir. Fermi ve Fermi öncesi GPU'larda hızlı matris-matris çarpma çekirdeğinin doğrudan CUDA'ya yazılmasının mümkün olduğunu da belirtmekte fayda var. En son Kepler GPU'ları için CUBLAS'ın performansına yaklaşmak için birinin PTX sözde meclis diline inmesi gerekiyor. Dolayısıyla, CUDA gibi bir satıcı tarafından kontrol edilen bir dilin bile donanım gelişmelerine ayak uyduracak sorunları olduğu görülüyor. Üstelik, tüm CUDA kodları nvcc'yi çalıştırdığınızda statik olarak derlenir, bu da biraz -arch bayrağı üzerinden bir dengeleme işlemi gerektirir, OpenCL çekirdeği tam zamanında derleyiciden çalışma zamanında derlenir; belirli bir hesaplama cihazının özelliklerine kadar. Ancak, sonuncusu oldukça ilgili ve genellikle kodunuz olgunlaştıkça ve deneyiminiz arttıkça çok çekici bir seçenek haline geliyor. Ödenmesi gereken ücret, belirli durumlarda sorun olabilen tam zamanında derleme için gereken O (1) süredir. OpenCL 2.

Hata Ayıklama ve Profil Oluşturma. CUDA hata ayıklama ve profil oluşturma araçları GPGPU için en iyisidir. AMD'nin araçları da fena değil, ancak cuda-gdb veya cuda-memcheck gibi taşlar içermiyor. Ayrıca, bugün hala NVIDIA GPGPU için en sağlam sürücüleri ve SDK'ları sağlıyor; buggy çekirdeği nedeniyle sistem donması, hem OpenCL hem de CUDA ile kural değil istisnadır. Muhtemelen burada açıklamak zorunda olmadığım nedenlerden dolayı, NVIDIA artık OpenCL için CUDA 5.0 ve üzeri sürümlerde hata ayıklama ve profil oluşturma olanağı sunmuyor.

Erişilebilirlik ve Kolaylık. İlk CUDA kodlarını çalıştırmak ve çalıştırmak çok daha kolaydır, çünkü özellikle CUDA kodu ana bilgisayar koduyla oldukça iyi bir şekilde bütünleşir. (Daha sonra ödenecek bedeli tartışacağım.) İnternette pek çok öğretici, ayrıca optimizasyon rehberleri ve bazı kütüphaneler var. OpenCL ile, bir miktar başlatma kodundan geçmeniz ve çekirdeklerinizi dizelere yazmanız gerekir, böylece yürütme sırasında yalnızca kaynakları jit-derleyiciye beslerken derleme hataları görürsünüz. Bu nedenle, OpenCL ile bir kod / derleme / hata ayıklama döngüsünden geçmek daha uzun sürer, bu nedenle verimlilik bu ilk geliştirme aşamasında genellikle daha düşüktür.

Yazılım Kütüphanesi Yönleri. Önceki kalemler CUDA lehine iken, diğer yazılımlara entegrasyon OpenCL için büyük bir artı. OpenCL'i sadece paylaşılan OpenCL kütüphanesine bağlayarak kullanabilirsiniz ve hepsi bu kadardır; CUDA ile birlikte tüm CUDA alet zincirini hazır bulundurmanız gerekir. Daha da kötüsü, nvcc'nin çalışması için doğru ana bilgisayar derleyicilerini kullanmanız gerekir. Örneğin, GCC 4.6 veya daha yenisiyle birlikte örneğin CUDA 4.2 kullanmaya çalıştıysanız, çalışmak için zor zamanlar geçirirsiniz. Genel olarak, kullanımda CUDA SDK'dan daha yeni olan herhangi bir derleyiciniz varsa, sorunların ortaya çıkması muhtemeldir. CMake gibi yapı sistemlerine entegrasyon başka bir baş ağrısı kaynağıdır (örneğin, PETSc hakkında çok fazla kanıt bulabilirsiniz.posta listeleri). Bu, kendi makinenizde tam kontrole sahip olduğunuz bir sorun olmayabilir, ancak kodunuzu dağıtır dağıtmaz, kullanıcıların yazılım yığınlarında bir şekilde kısıtlı olduğu durumlar ile karşılaşırsınız. Başka bir deyişle, CUDA ile artık en sevdiğiniz sunucu derleyicinizi seçmekte özgür değilsiniz, ancak NVIDIA hangi derleyicileri kullanmanıza izin verdiğini belirler.

Diğer görüşler. CUDA donanıma biraz daha yakındır (örneğin çözgü), ancak lineer cebir konusundaki deneyimim nadiren önemli ölçüde faydalanmanızdır. CUDA için bir kaç yazılım kütüphanesi daha var, fakat giderek daha fazla sayıda kütüphane çoklu bilgi işlem arka uçları kullanıyor. ViennaCL , VexCL veya Paralution'un tümü OpenCL ve CUDA arka uçlarını desteklerken, diğer bölgelerdeki kütüphanelerde de benzer bir eğilim görülebilir.

GPGPU bir Gümüş Mermi değildir. GPGPU'nun yapılandırılmış işlemler ve hesaplama sınırlı görevler için iyi performans sağladığı gösterilmiştir. Bununla birlikte, sıralı işlemlerde ihmal edilemez bir payı olan algoritmalar için GPGPU, Amdahl Yasasını sihirli bir şekilde yenemez . Bu gibi durumlarda, probleminize paralel, ancak daha az uygun bir algoritma atmaya çalışmak yerine mevcut en iyi algoritmanın iyi bir CPU uygulamasını kullanmaktan daha iyidir. Ayrıca, PCI-Express ciddi bir tıkanıklıktır, bu nedenle GPU'lardan elde edilen tasarrufların hareketli verinin ek yükünü telafi edip edemediğini önceden kontrol etmeniz gerekir.

Benim önerim. CUDA'yı düşünün ve OpenCL ziyade CUDA'yı veyaOpenCL. Gereksiz yere kendinizi bir platforma sınırlamanıza gerek yoktur, bunun yerine her iki dünyanın da en iyisini alın. Benim için iyi sonuç veren, CUDA'da bir ilk uygulama oluşturmak, hata ayıklamak, profil oluşturmak ve sonra basit dize değişimleriyle OpenCL'e iletmektir. (OpenCL çekirdek dizisi oluşturma yordamlarınızı bile biraz esnekliğe sahip olacak şekilde parametreleştirebilirsiniz. Hedef donanımın ayarlanması.) Bu taşıma çabası genellikle zamanınızın yüzde 10'undan daha azını tüketir, ancak diğer donanımlarda da çalışmanıza olanak tanır. NVIDIA dışı donanımın belirli durumlarda ne kadar iyi performans gösterdiğine şaşırmış olabilirsiniz. Hepsinden önemlisi, kütüphanelerdeki işlevselliğin tekrar kullanılmasını mümkün olduğunca düşünün. Hızlı iken bazı işlevlerin kirli şekilde yeniden uygulanması genellikle bir CPU üzerindeki tek iş parçacıklı çalıştırma için kabul edilebilir bir şekilde çalışır, genellikle toplu olarak paralel donanımda düşük performans sağlar. İdeal olarak, her şeyi kütüphanelere boşaltabilirsiniz, hatta CUDA, OpenCL veya dahili olarak kullanıp kullanmadıklarını umursamanız bile gerekmiyor. Şahsen, bundan birkaç yıl sonra güvenmek istediğim bir şey için satıcı kilitli kod yazmaya asla cüret edemem, ama bu ideolojik yön ayrı bir tartışmaya girmeli.


Her iki platformda standart 1D, 2D, 3D FFT'nin şu andaki performansı ve kullanılabilirliği hakkında ne düşünüyorsunuz?
saat

JIT derlemesiyle ilgili olarak, CUDA ayrıca bu imkanı sunmaktadır , ancak bazı kısıtlamalar vardır.
BenC

@hwlau: FFT, satıcı kütüphaneleri için standart bir işlevselliktir, CUDA ve OpenCL'den oldukça bağımsızdır.
Karl Rupp

@BenC: Kısıtlamalar gerçekten çok şiddetli, sadece önceden derlenmiş CUDA çekirdeklerinin temel donanım için bir uzmanlığı.
Karl Rupp

1
Üzerinde herhangi bir yorum var mı bu potansiyel sorun ? Bunun AMD donanımıyla mı yoksa OpenCL'in kendisiyle mi ilgili olduğu (yani, sorunun NVIDIA'da OpenCL'de bulunup bulunmadığı) benim için net değil . Belki de bu, çoğu bilimsel bilgi işlem uygulamasında bir sorun değildir, çünkü gelişmiş bir ışın izleyiciden daha küçük ve daha az karmaşık olma eğilimindedirler. Btw cevap için teşekkürler!
Szabolcs
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.