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.