GPU yerine CPU kullanmanın yararları var mı?


63

İşlemciler ve grafik kartları araştırıyordum ve GPU'ların CPU'lardan çok daha hızlı olduğunu keşfettim. Bu makalede okudum , 2 yaşındaki Nvidia GPU, bazı durumlarda 3.2GHz Core I7 Intel işlemciden daha iyi performans gösterdi. GPU'lar bu kadar hızlıysa, geliştiriciler neden bir oyunda her işlev için bunları kullanmıyor? GPU'ların grafikten başka bir şey yapması mümkün mü?


17
Her şeyi GPU'ya aktardığınız bir oyundaysanız ve CPU'nuz neredeyse hiç bir şey yapmıyorsa, yükün bir kısmını CPU'ya geri koyarak performans artışı elde edebilirsiniz.
Tetrad

3
GPU’nuz CPU’nuzdan daha iyi olabilir ancak ekran kartınızın anakartınızdan daha iyi olduğunu sanmıyorum (ve işletim sistemini sürücü lol ile karşılaştırmayacağım)
e-MEE

27
GPU is faster than a CPU: birçok kişi, özellikle GPU için içindir sorunlara dayalı kriterler gördükten sonra inanmaya önderlik ettiği sahte mit, bu SuperUser soru üzerine Cevabımı (bkz sorunların bu sınıf "utanç verici paralel sorunları" olarak adlandırılır) olduğu hala kullanıyor Neden GPU'lar yerine CPU'lar?
Yalan Ryan


5
Bunun bir yararı, her bilgisayarın bir CPU'su olduğudur :)
Tim Holt

Yanıtlar:


50

“F1 otomobillerinin sokaklarda kullandıklarımızdan daha hızlı olduğunu okudum… neden insanlar F1 arabalarını kullanmıyorlar?” Şey ... Bu sorunun cevabı basittir: F1 arabaları çoğu araba kadar hızlı kıramaz veya dönemez (en yavaş araba bu durumda bir F1'i yenebilir). GPU'ların durumu çok benzerdir, düz bir işlem hattını takip etmede iyidirler, ancak farklı işlem yollarını seçme konusunda çok iyi değillerdir.

GPU'da yürütülen bir program, çoğu zaman paralel olarak yürütülmesi gerektiğini, örneğin Doku A'daki tüm pikselleri Doku B'deki piksellerle karıştırmanız ve hepsini Doku C'ye koymanız gerektiğinde anlamlıdır. Bir CPU, böyle bir şey olarak işlenir:

for( int i =0; i< nPixelCount; i++ )
     TexC[i] = TexA[i] + TexB[i];

Ancak, çok fazla piksel işlemeniz gerektiğinde bu yavaştır, bu nedenle yukarıdaki kodu kullanmak yerine GPU bir sonrakini kullanır:

     TexC[i] = TexA[i] + TexB[i];

ve sonra bu program ile tüm çekirdeği doldurur (esasen programı çekirdeğe kopyalamak), iher birine bir değer atar . O zaman GPU'nun sihri gelir ve tüm çekirdeği programı aynı anda çalıştırır, lineer CPU programından çok daha hızlı işlem yapar.

Aynı şekilde çok fazla küçük girdiyi işlemeniz gerektiğinde bu çalışma şekli tamamdır, ancak koşullu dallanmaya sahip bir program yapmanız gerektiğinde gerçekten kötüdür. Öyleyse şimdi bir durum kontrolü söz konusu olduğunda CPU'nun ne yaptığını görelim:

  • 1: İlk mantıksal işleme kadar programı yürütün
  • 2: Değerlendir
  • 3: Karşılaştırma işleminin hafıza adresinden çalışmaya devam edin (JNZ asm komutunda olduğu gibi)

Bu, CPU için bir indeks belirleme açısından çok hızlıdır, ancak GPU'nun da aynı şekilde yapması çok daha karmaşıktır. GPU’nun gücü aynı talimatı aynı anda yerine getirmekten (SIMD çekirdeği) geliyor, yonga mimarisinden yararlanabilmek için senkronize edilmeleri gerekiyor. GPU’yu şubelerle başa çıkmak için hazırlamak, aşağı yukarı aşağıdakine işaret eder:

  • 1: Programın yalnızca A dalını takip eden bir sürümünü yapın, bu kodu tüm çekirdeklere yerleştirin.
  • 2: İlk mantıksal işleme kadar programı yürütün
  • 3: Tüm unsurları değerlendirin
  • 4: A branşını takip eden tüm elemanları işlemeye devam et, B yolunu seçen tüm süreçleri zorla (bunun için çekirdek yok!). Şimdi B yolunu seçen tüm çekirdekler IDLE !! olacak - en kötü durum tek bir çekirdeğin çalıştırılması ve diğer bütün çekirdeğin beklemesi.
  • 5: Hepsi İşlendikten sonra, programın B dalı sürümünü etkinleştirin (bellek arabelleklerinden bazı küçük çekirdek belleğe kopyalayarak).
  • 6: B Şubesini yürütün.
  • 7: Gerekirse, her iki sonucu da karıştırın / birleştirin.

Bu yöntem birçok şeye bağlı olarak değişebilir (yani, bazıları çok küçükşubeler bu ayrıma ihtiyaç duymadan koşabilirler) ama şimdi dallanmanın neden bir sorun olacağını zaten görebilirsiniz. GPU önbellekleri çok küçüktür, VRAM'dan bir programı doğrusal bir şekilde basitçe uygulayamazsınız, küçük talimat bloklarını yürütülecek çekirdeğe kopyalamak zorunda kalır ve eğer yeteri kadar dalınız varsa GPU'nuz çoğunlukla yürütmekten daha fazla durur Birden fazla iş parçacığında çalışsa bile, çoğu programda olduğu gibi, yalnızca bir dalı izleyen bir program yürütülürken, hiçbir zaman bir anlam ifade etmeyen kod. F1 örneğiyle karşılaştırıldığında bu, her köşede fren paraşütleri açmak, daha sonra tekrar açmak veya bir kırmızı semafor bulmak istediğiniz bir sonraki köşeye kadar onları arabanın içine geri yerleştirmek için arabadan çıkmak gibi olacaktır. büyük ihtimalle).

O zaman elbette, diğer mimarilerin mantıksal işlemler, yani daha ucuz ve daha güvenilir, standart, daha iyi bilinen, güç açısından verimli, vb. Görevlerinde çok iyi olma problemi var. Yeni video kartları, yazılım öykünmesi olmayan eskilerle pek uyumlu değil. aralarında aynı üreticiden olsalar bile farklı asm komutları kullanın ve çoğu bilgisayar uygulaması için bu tür paralel mimariye gerek duymaz ve buna ihtiyaç duysalar bile OpenCL gibi standart apisleri kullanabilirler. eBusiness tarafından veya grafikler aracılığıyla belirtilir. Muhtemelen bazı yıllarda CPU'ların yerini alabilecek GPU'larımız olacak, ancak yakın zamanda gerçekleşeceğini sanmıyorum.

GPU mimarisi hakkında çok şey anlatan AMD APP’nin dokümantasyonunu öneriyorum ve NVIDIA’lar hakkında da CUDA kılavuzlarında bunu anladım. Hala bazı şeyleri anlamıyorum ve yanılıyor olabilirim, muhtemelen daha fazlasını bilen biri ifadelerimi onaylayabilir veya reddedebilir, ki bu hepimiz için harika olur.


6
garip bir benzetme ama bu iyi bir nokta the fastest isn't always the fastest.
Yalan Ryan

1
Teşekkürler! Bunun ilginç bir konu olduğunu düşünüyorum çünkü birçok oyun programlama kavramını, bugünün yüksek seviyeli dilleri diyarında unutulan donanımın çalışma biçimine bağlar. Eklemek istediğim başka şeyler var ama cevabı yazmak biraz zaman aldı, bu yüzden daha sonra güncellemek isteyeceğim, CPU'ların "korumalı mod" yetenekleri, bellek veriyolu hızı vb. GPU'daki her şeyi yapmanın bazı teknik sakıncaları.
Pablo Ariel

6
Analoji doğru olsaydı çok daha iyi olurdu. F1 otomobilleri, önceden iyi bir şekilde frene basmak yerine, yüksek hızları bir eğride daha ileride tutmalarına izin veren muazzam frenleme kabiliyetlerine sahiptir. Dönme yarıçapı büyük olasılıkla otoparklar için harika olmasa da, yüksek hızlarda viraj alma da yüksek düşürmeler sayesinde daha iyidir. Daha iyi nedenler arasında depolama alanı eksikliği, dikiz aynası, klima, seyir kontrolü, elemanlardan koruma, yolcu koltukları, yoksul yolları kullanmak için süspansiyon ve yerden yükseklik veya yolcu araçlarında yaygın olarak kullanılan diğer şeyler olabilir.
GargantuChet

5
@Pablo Ariel "F1 otomobilleri çoğu otomobilin yaptığı kadar hızlı kıramaz veya dönüş yapamaz" ifadesine cevap veriyorum. F1 otomobillerinin sadece düz bir çizgide hızlanabileceğini ve sırayla ya da yavaşlama sırasında çok iyi olmadıklarını söylüyorsunuz. Ancak F1 arabaları aslında "çoğu araba" dan çok daha hızlı bir şekilde fren yapabilir ve yüksek hızlı virajlarda mükemmeldir.
GargantuChet

4
F1 arabaları yerine Dragster'lerde düşünürseniz analoji daha doğrudur
Agustin Meriles

32

GPU'lar paralel işler için çok iyidir. Hangisi harika ... paralel işler yapıyorsanız.

Oyunlar en az paralelleştirilebilen uygulama türüyle ilgilidir. Ana oyun döngüsünü düşün. AI (oyuncunun AI'nın özel bir durumu olarak ele alındığını varsayalım) fiziğin tespit ettiği çarpışmalara cevap vermesi gerekir. Bu nedenle daha sonra çalışması gerekir. Veya en azından fiziğin, fizik sisteminin sınırları dahilinde AI rutinleri çağırması gerekir (bu, pek çok nedenden dolayı genellikle iyi bir fikir değildir). Grafikler fizik çalışana kadar çalışamaz, çünkü fizik nesnelerin konumunu güncelleyen şeydir. Elbette, AI'nın yeni nesneler üretebildiğinden, oluşturulmadan önce de çalışması gerekir. AI ve oynatıcı kontrollerinden sonra seslerin çalışması gerekir

Genel olarak, oyunlar kendilerini çok az yoldan oynatabilirler. Grafikler bir iplik halinde döndürülebilir; Oyun döngüsü, grafik iş parçacığında bir sürü veriyi zorlayabilir ve şöyle diyebilir: bunu yap. Bazı temel enterpolasyonlar yapabilir, böylece ana oyun döngüsünün grafiklerle senkronize olması gerekmez. Ses başka bir konu; oyun döngüsü “bunu oyna” diyor ve oynanıyor.

Ondan sonra, her şey acı çekmeye başlar. Karmaşık yama algoritmaları varsa (örneğin, RTS'ler için), bunları işleyebilirsiniz. Algoritmaların tamamlanması birkaç kare alabilir, ancak en azından eşzamanlı olurlar. Bunun ötesinde, oldukça zor.

Yani 4 konuya bakıyorsunuz: oyun, grafik, ses ve muhtemelen uzun vadeli AI işleme. Bu fazla değil. Ve bu , aynı anda yüzlerce ipliğin aynı anda uçabileceği GPU'lar için neredeyse yeterli değil . GPU'lara performanslarını veren budur: tüm bu konuları bir seferde kullanabilmek. Ve oyunlar basitçe bunu yapamaz.

Şimdi, belki de bazı işlemler için "geniş" gidebilirsiniz. Örneğin AI'ler genellikle birbirinden bağımsızdır. Böylece aynı anda birkaç düzine AI'yi işleyebilirsiniz. Onları gerçekte birbirlerine bağımlı hale getirmeniz gerekene kadar. O zaman başın belada. Fizik nesneleri benzer şekilde bağımsızdır ... aralarında bir kısıtlama yoksa ve / veya bir şeyle çarpışırsa. Sonra çok bağımlı hale gelirler.

Ayrıca, GPU’nun kullanıcı girişine erişimi olmadığı gerçeği var, ki anladığım kadarıyla oyunlar için çok önemli. Böylece temin edilmesi gerekecekti. Ayrıca doğrudan dosya erişimi veya işletim sistemi ile konuşmada herhangi bir gerçek yöntem yoktur; bu yüzden tekrar, bunu sağlamanın bir yolu olmalı. Oh, ve bütün bu ses işleme? GPU'lar ses çıkarmıyor. Bu yüzden bunların CPU'ya ve sonra ses çipine geri dönmesi gerekiyor.

Oh, GPU'ları kodlamak korkunç. Doğru elde etmek zor ve bir GPU mimarisi için "doğru" olan, diğeri için çok, çok yanlış olabilir . Ve bu sadece AMD'den NVIDIA'ya geçmiyor; Bu bir GeForce 250'den GeForce 450'ye geçiyor olabilir. Temel mimaride bir değişiklik. Ve kolayca kodunuzun iyi çalışmamasını sağlayabilir. C ++ ve hatta C'ye izin verilmiyor; elde edebileceğiniz en iyi şey, bir tür C gibi olan ancak bazı çeşitliliklerin olmadığı OpenCL'dir. Gibi özyineleme . Bu doğru: GPU'larda özyineleme yok.

Hata ayıklama? Oh, umarım IDE'nizin hata ayıklama özelliklerini beğenmezsiniz, çünkü bunlar kesinlikle kullanılamayacak. GDB kullanıyor olsanız bile, elveda öpücüğü verin. printfHata ayıklamaya başvurmak zorunda kalacaksın ... bekle, printfGPU'larda yok . Bu nedenle, bellek konumlarına yazmanız ve CPU saplama programınızın onları tekrar okumasını sağlamanız gerekir.

Doğru: manuel hata ayıklama. Bununla iyi şanslar.

Ayrıca, C / C ++ ile kullandığınız bu yardımcı kitaplıklar? Belki de XNA ve benzerlerini kullanan daha çok bir .NET adamısınız. Ya da her neyse. Önemli değil, çünkü bunların hiçbirini GPU'da kullanamazsınız . Her şeyi sıfırdan kodlamanız gerekir. Zaten mevcut bir kod tabanına sahipseniz, zor: tüm kodları yeniden yazma zamanı.

Yani evet. Her türlü karmaşık oyun için gerçekten dehşet verici. Ve işe yaramadı bile, çünkü oyunlar yardım edecek kadar paralel değil.


21

Neden cevap vermek bu kadar kolay değil - GPU'ların normal bir CPU gibi genel kullanıma yönelik olmayan özel işlemciler olduğunu not etmek önemlidir. Bu uzmanlık nedeniyle, bir GPU'nun özel olarak tasarlandığı (ve optimize ettiği) işlemler için bir CPU'dan daha iyi performans göstermesi şaşırtıcı değildir, ancak bu, genel bir CPU'nun tam işlevselliğini ve performansını değiştirebileceği anlamına gelmez.

Geliştiricilerin, aşağıdakileri de içeren çeşitli nedenlerle yapmadığından şüpheleniyorum:

  • Grafiklerin mümkün olan en hızlı ve en yüksek kalitede olmasını istiyorlar ve değerli GPU kaynaklarını kullanmak buna engel olabilir.

  • GPU’ya özgü kodun yazılması gerekebilir ve bu muhtemelen eldeki oyunun (veya uygulamanın) genel programlanmasına ek karmaşıklık getirecektir.

  • Bir GPU normalde ağ kartları, klavyeler, fareler ve joystickler gibi kaynaklara erişemez, bu nedenle oyunun her yönüyle başa çıkması mümkün değildir.

Sorunuzun ikinci kısmına cevaben: Evet, başka kullanımlar da var. Örneğin, SETI @ Home (ve muhtemelen diğer BOINC projeleri) gibi projeler yüksek hızlı karmaşık hesaplamalar için GPU'ları (nVidia'nın yaptığı gibi) kullanıyor:

  SETI @ home'u NVIDIA GPU'nuzda çalıştırın
  http://setiathome.berkeley.edu/cuda.php

( Sorunuzu sevdim çünkü ilginç bir fikir ortaya atıyor. )


18

İşlemciler daha esnektir, bunları programlamak genellikle daha kolaydır, tek başlıkları çok daha hızlı çalıştırabilirler.

Modern GPU'lar hemen hemen her işi çözmek için programlanabilirken, paralel mimarilerini kullanabildiklerinde yalnızca hız avantajı elde ederler. Bu genellikle yüksek derecede tekrarlayan "basit" görevlerde geçerlidir. Yazdığımız kodun çoğu, bir GPU'da verimli bir şekilde çalışamayacak kadar öngörülemeyen bir şekilde dallanıyor.

Tüm bunların ötesinde, farklı grafik yongaları için kodu optimize etmek için çok zaman harcayabilirsiniz. OpenCL, aynı kodu birçok farklı grafik yongasında çalıştırmaya hazır olsa da, bu lüks için hız avantajlarından bazılarını takas edersiniz.

Bir oyun programcısı perspektifinden, genel olarak oyunumuzun daha az grafik kartı olan bilgisayarlarda çalışmasını isterdik. Entegre çiplerin bazıları gerekli programlanabilirliğe sahip değil, ancak yaparlarsa çok yavaşlarlar, işlemcileri iyi olması gereken işler için bile çok büyük bir farkla yenemeyecekler. Ve elbette, bir oyun için düşük seviye bir GPU'ya dokunmuş olsaydınız, grafik işleme işleminden çok fazla ihtiyaç duyulan işlem gücüne ihtiyacınız olurdu.

Gerçekten de beklentiler harika, ancak şifreleri kırmak yerine bir oyun yaparken çoğu zaman pratik meseleler faydalardan ağır basıyor.


6

GPU’yu programlamak çok zordur. Bir GPU'da bir listenin nasıl sıralanacağını araştırmalısınız . Birçok tez yapmak için arama var.

Bir iş parçacığı ile bir CPU kullanımı kolaydır, çoklu iş parçacığı kullanımı daha zordur, PVM veya MPI zor olduğu ve bir gpu kullanımı en zor olduğu gibi paralel kütüphaneli birçok bilgisayar kullanın.


4

Ne dışında Randolf Richardson cevap GPU işlemcileri kendileri tarafından işleyemez belli işlevleri vardır. Örneğin, grafik belleği yönetim komutlarından bazıları GPU tarafından işlenemediğinden CPU tarafından işlenir.

Ve bir büyük neden daha var, GPU çok iş parçacıklı hesaplamalar için tasarlandı. Bu, GPU üreticilerinin, hesaplama gücünü artırmak istediklerinde kolayca çekirdek ekleyebilecekleri anlamına gelir. Ancak Fibonacci serisindeki n'ci sayıyı hesaplamak gibi daha küçük sorunlara bölünemeyen birçok görev var . Bu durumlarda CPU, tek iş parçacıklı işler için daha optimize edildiğinden çok daha hızlıdır.


4

GPU'ların yalnızca daha hızlı olduğunu düşündüren çok sayıda yanıt var çünkü görevleri paralel olarak ele alıyorlar. Bu konuyu biraz abartıyor. GPU'lar, daha kısıtlayıcı hafıza erişimine sahip olmak, çok sayıda veri türünü desteklememek, daha verimli bir talimat setine sahip olmak, vb. Gibi diğer nedenlerden dolayı daha verimli olabilir. Erken GPU'lar hala sadece 1 piksel çekebilir Bir zaman, ancak önemli olan her döngüde 1 yapabilecekleri gerçekti.

Gerçek fark, benzer görünen ancak aslında oldukça farklı olan farklı görev kategorilerinde iyi performans gösterecek şekilde özelleştirilmiş 2 farklı makine türü olmalarıdır . Bir uçağı arabaya benzetmek gibidir. Uçağın daha yüksek bir hızı var ancak nasıl kullanılacağı konusunda daha fazla kısıtlama var. Her iki türle de aynı yolculuğu yapabileceğiniz durumlarda, uçak üstün görünüyor.


Uçakla ilgili benzetme çok iyi (+1), ancak aslında CPU'ların (en azından Intel alanında) sadece en üst düzeyde işlemeye meyilli olduğu gibi aslında daha yüksek düzeyde bir dil kavramına sahip olan farklı veri tiplerini destekleyen CPU'larla ilgili olarak Çok temel formlardaki veriler (örneğin, bitler, baytlar, kelimeler, dwords vb.). Sıfır bayt ile sonlandırılmış verileri taramak veya kopyalamak için bazı sıkı döngü yönergeleri vardır, ancak bu durumlarda veriler CPU tarafından belirli bir tür olarak tanınmaz (sıfır sonlandırılmış bir veri yığını olmaktan başka) Bu döngüler bağlamında).
Randolf Richardson

@Randolf: CPU'lar farklı düşük seviye veri tipleriyle ilgilenen farklı talimatlara ve kayıtlara sahiptir (örn. İmzalanmış, imzasız, ayrılmaz ve kayan nokta gibi). Bu, 8086'daki ve gerçekten de çoğu modern mimarideki durumdur ve tamamen ücretsiz değildir.
Kylotan

Temel mimaride hala çok fazla lineer işlem yaptıklarına eminim. Programlama tarafından GPU'ya sadece bir talimat verilir, ancak çekirdekler bellekten okuma gibi paralel olmayan diğer donanıma bağlı olmalarından dolayı tam olarak paralel çalışmazlar, muhtemelen GPU, veri merkezindeki tek bir çekirdeğe veri sağlayabilir. bir zaman.
Pablo Ariel

3

Geliştiriciler , GPU'ları iyi oldukları tüm işlevler için kullanırlar. İşlemcileri iyi oldukları tüm işlevler için kullanırlar. Yapmadıklarını düşündüren nedir?

GPU'lar, büyük ölçüde paralelleştirilebilecek ve düşük bellek gereklilikleri ya da sadece küçük miktarlarda karar vermeyle yüksek zamansal korelasyonlarla büyük miktarda hesaplama gerektiren görevlerde iyidir. Bu, görüntü oluşturma, fizik simülasyonları (parçacıklar, çarpışma, kumaş, su, yansıma) vb. İçerir. İşte bu tam olarak modern oyunların GPU'yu kullandığı şey.

İşlemciler, iyi paralel olmayan ve büyük miktarlarda karar vermeyi gerektiren görevlerde iyidir. Yalnızca orta derecede geçici korelasyonla bile yüksek bellek gereksinimlerini tolere edebilirler. Bu yapay zeka, kullanıcı arayüzü, disk ve ağ giriş / çıkış vb. İçerir. İşte bu tam da modern oyunların CPU'yu kullandığı şey.


1

Geri okuma, zaman zaman CPU'yu tercih etmeyi düşünebilmemin bir nedeni. Bant genişliği açısından değil (GPU-> CPU bant genişliği modern donanım için çok fazla bir sorun değil) ama boru hattını durdurma açısından. Bir hesaplamanın sonuçlarını geri getirmeniz ve bunlarla ilgili ilginç veya faydalı bir şeyler yapmanız gerekirse, GPU'yu kullanmak akıllıca bir seçim değildir (genel durumda - uygun kalabileceği özel durumlar olacaktır), geri okumak her zaman gerekli olacaktır. GPU ne yapıyorsa onu durdurur, bekleyen tüm komutları siler ve geri okumanın tamamlanmasını bekler. Bu, GPU'yu kullanmanın yararını ortadan kaldırmakla kalmaz, aynı zamanda oldukça daha yavaş olabilir.


0

Bu eski bir iş parçacığıdır, ancak bu son zamanlarda yayınlanan makale bu soruyu cevaplayabilir. ACM Bilgi İşlem Anketleri 2015'te yayınlanan bu makale, CPU ve GPU'ların her birinin kendine özgü avantajları olduğunu ve bu nedenle, bu makalenin "CPU vs GPU tartışmasından" "CPU-GPU işbirliğine dayalı hesaplama" paradigmasından uzaklaşması için bir örnek teşkil etmektedir.

CPU-GPU Heterojen Hesaplama Teknikleri Araştırması

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.