Yazılım programlamasında, hem CPU hem de GPU yüklerinin% 100 oranında olması mümkün müdür?


43

Bir oyuncu olarak ilginç bulduğum bir konu hakkında genel bir soru: CPU / GPU darboğazları ve programlaması. Yanılmıyorsam, hem CPU hem de GPU’nun bir şeyler hesapladığını anlıyorum, ancak bunun bazı hesaplamalarda mimarideki farklılık nedeniyle diğerinden daha iyi olduğunu anladım. Örneğin, kırma karmaları veya kripto para birimi madenciliği GPU'larda CPU'lardan çok daha verimli görünüyor.

Yani merak ettim: GPU'su% 100 yüke sahipken% 100 GPU'ya sahip olmak kaçınılmaz mı?

Ya da daha doğrusu: Normalde GPU tarafından yapılan bazı hesaplamalar, birincisi% 100 yüklüyse CPU tarafından yapılabilir, böylece her ikisi de% 100 yüke erişebilir mi?

Konu hakkında biraz aradım, ancak oldukça boş elle geri döndüm. Bunun bu alt bölümde yer aldığını düşünüyorum ve umarım bana verebileceğiniz her türlü belgeye veya konuşmaya açığım!


53
Hem CPU hem de GPU’nun NO-OPaynı anda sonsuz bir s döngüsü çalıştırması , her ikisinin de% 100 yüke sahip olmasına neden olacak şekilde çok önemlidir .
Jörg W Mittag

17
@ Jörg'ün amacını takiben,% CPU ile ölçülen tek şey, zamanın kesirinin diğer işlemciler için beklemeden geçirilmemesidir. % 100 programın verimli olması durumunda iyi veya programın verimsiz olması durumunda kötü bir şey olabilir. Çok fazla zaman, insanlar% CPU'yu bir performans ölçütü gibi ele alıyorlar - öyle değil.
Mike Dunlavey

22
Orijinal Crysis bunu çok iyi yaptı.
CubicleSoft

5
@MikeDunlavey size iyi bir noktaya getiriyor. Otomobillerle performanslarını RPM ile ölçmeyiz, hızı ölçeriz.
Kaptan Adam,

1
@ JörgWMittag: Belki de CPU. Ancak işletim sistemleri ve GPU'lar sonsuz döngülerle başa çıkmak için problem çözenleri durduruyor. Yani, bir gölgelendirici makul bir sürede tamamlanmazsa ölür ve GPU sıfırlanır.
Nicol Bolas,

Yanıtlar:


62

Teorik olarak evet, fakat pratikte buna nadiren değer.

Hem CPU hem de GPU'lar tamamlanmıştır , bu nedenle biri tarafından hesaplanabilen herhangi bir algoritma diğeri tarafından da hesaplanabilir. Soru ne kadar hızlı ve ne kadar uygun.

GPU, büyük bir veri kümesinin birçok veri noktasında aynı basit hesaplamaları yapmakta başarılı olurken, CPU çok dallanma ile daha karmaşık algoritmalarda daha iyidir. Çoğu problemde CPU ve GPU uygulamaları arasındaki performans farkı çok büyüktür. Bu, birini dururken diğerinden işe almak için kullanmanın, performansta kayda değer bir artışa yol açmayacağı anlamına gelir.

Ancak bunun için ödemeniz gereken fiyat, her şeyi iki kez, bir kez CPU için ve bir kez de GPU için programlamanız gerektiğidir. Bu iki kattan fazla iş çünkü anahtarlama ve senkronizasyon mantığını uygulamanız gerekecek. Bu mantığın test edilmesi son derece zordur, çünkü davranışı mevcut yüke bağlıdır. Bu dublörden böcek çoğaltmak için çok karanlık ve imkansız bekleyin.


1
Bunu söz CPU ve GPU uygulamaları arasındaki performans farkı çok büyük çok problem ile , aslında oldukça performans farkı gider ölçüde ilgi ediyorum. Bununla ilgili herhangi bir sayı veya makaleniz var mı (örneğin, doku 3D-oluşturma örneğinde)? Cevabınız ve zaman ayırdığınız için teşekkür ederiz!
MadWard

2
CPU ve GPU arasında senkronizasyon için performans maliyetleri olduğunu eklemek isteyebilirsiniz, bu nedenle genellikle ikisi arasındaki transfer sayısını en aza indirmek istersiniz. Ayrıca, GPU dişlileri kilitlendiği için çalıştığından, "işlemcinin zaten çalıştığı elemanlar üzerinde çalıştırma" için dallara saf bir şekilde eklemek size bir şey almayacaktı.
Ethan

3
@gardenhead Evrendeki hiçbir şey sınırlanmamış özyinelemeyi desteklemez, çünkü evren sonlu boyuttadır ve sonlu bilgi yoğunluğuna sahiptir. Bir sistemin "dönme tamamlığı" genellikle, bu gibi kısıtlamaların kaldırılmasıyla neyin mümkün olacağının bir tartışmasıdır.
Random832

3
Modern bir GPU’nun teknik olarak en azından 80’in PC’si kadar Turing eksiksizliğine yakın olduğuna hiç şüphem yok… ancak genel algoritmaları bir GPU’da çalıştırmayı denerseniz, genellikle normal olmayan bir işlemciye dönüşecektir. 80'lerin bilgisayarından daha hızlı, bu nedenle bir GPU'nun Turing'in eksiksizliği pratikte Brainfuck'un Turing'in eksiksizliğinden çok daha kullanışlı .
leftaroundabout

7
@leftaroundabout Modern GPU'lar önemsiz şekilde herhangi bir CPU olarak tam çalışıyorlar . Torna bütünlüğünün aşağıdakilerle ilgisi yoktur: 1) performans 2) kaynağın okunabilirliği. 80’lerin işlemcisi, TC’ye yakın olan her şeye sahipti: ya TC idi ya da değildi (ikinci seçenek saçma).
Margaret Bloom

36

Oyun programlaması ile ilgili değil. Bazı bilimsel kodlar hem GPU’yu hem de CPU’yu kullanabilir.

Dikkatli ve acı verici bir programlama ile, örneğin OpenCL veya CUDA kullanarak , hem GPU'nuzu hem de CPU'nuzu% 100'e yakın bir şekilde yükleyebilirsiniz. Çok büyük olasılıkla GPU ("çekirdek" kodu olarak adlandırılan) ve CPU için farklı kod parçaları ve bazı sıkıcı tutkal kodları (özellikle GPU'ya derlenmiş çekirdek kodunu göndermek için) yazmanız gerekir.

Bununla birlikte, kod karmaşık olacaktır ve muhtemelen çalıştırdığınız belirli bir donanıma ayarlamanız gerekir, özellikle de GPU ve CPU arasındaki veri iletimi pahalı olduğundan.

Heterojen hesaplama hakkında daha fazla bilgi edinin .

Ayrıca bkz . GCC'nin son sürümleri tarafından desteklenen OpenACC (örneğin , 2016 Haziran ayında GCC 6 ).


1
Haklısın, etiketlerim ve başlığım yanıltıcıydı, oyunlar kaldırıldı ve performans / optimizasyon eklendi. Oyunlara özel olduğunu kastetmedim, ama orayı fark ettim. Ben de donanıma özgü olması gerektiğini düşündüm. Cevabınız ve bağlantılar için teşekkür ederiz!
MadWard

3
Bu hemen hemen iki algoritma ile sonuçlanacaktı. Bir keresinde denedim: GPU için bir kerede tüm görüntü ve CPU için bir kerede birden fazla görüntü (büyük önbelleğe suistimal etmek için). Gerçekten korumak acı vericidir.
PTwr

11

Süper hesaplama açısından bakıldığında CPU / GPU yükünü yüzde cinsinden düşünmemek, eldeki problemin kaç tane işlem yapması gerektiğini belirlemek ve bunu sistemin en yüksek performansı ile karşılaştırmak daha iyidir.

Eğer% 100 CPU kullanımı elde ederseniz, mutlaka tüm performansı sistemden çıkardığınız anlamına gelmez. İşlemciler genellikle aynı anda birçok farklı şey yapabilir, böylelikle bir bölünme ve ek olarak söylerler. Bölmeye erken başlayabilirseniz, muhtemelen ekleme ile üst üste gelebilir. Masaüstü işlemciniz, büyük olasılıkla, bu tür çakışmalardan yararlanmak için ifadeleri yeniden düzenleyen bir sipariş dışı birime sahiptir. Veya aşağıdaki programa sahipseniz:

if (expr1)
    expr2;
else
    expr3;

Yeniden sıralama yapan bir CPU , aynı anda üç ifadeyi hesaplamaya çalışacak ve ardından bunlardan birinin sonucunu atmaya çalışacaktır. Bu genel olarak daha hızlı yapar. Programınızda bazı engelleyiciler varsa ve yeniden sıralayamıyorsanız, CPU'da daha az şerit kullanıyorsunuzdur, ancak muhtemelen% 100'ünü gösterecektir.

Daha sonra CPU'da vektör işlemleri olan SIMD özelliklerine sahipsiniz. Genelde aynı anda yalnızca dört veya sekiz işlem yaptığınız için GPGPU ışığı gibidir, GPU'lar 32 veya 64'ü sever. Yine de bunu FLOPS'u çıkarmak için kullanmanız gerekir.

Sahte paylaşım gibi şeyler, Linux'ta genellikle çekirdek yükü olarak ortaya çıkan ağır bir senkronizasyon maliyetine yol açabilir. CPU tamamen kullanılıyor, ancak çok fazla işlem hacminiz yok.

Bir IBM Blue Gene / Q makinesinde bazı programlama yaptım. Birçok hiyerarşi seviyesine sahiptir ( modası geçmiş Blue Gene / L'nin şeması ) ve bu nedenle verimli bir şekilde programlanması zordur. Performansı elde etmek için SIMD ve SMT'ye kadar tüm hiyerarşiyi kullanmanız gerekecektir (Intel bu HyperThreading'i çağırır).

Ve sonra ağ genellikle sizi sınırlar. Bu nedenle, ağ üzerinden iletişim kurmak yerine, aynı anda birden fazla CPU'da işlem yapmak için (duvar saati) zamanının daha hızlı olduğu ortaya çıkıyor. Bu CPU'lara daha fazla yük getirecek ve programın daha hızlı çalışmasını sağlayacaktır. Ancak gerçek program verimi, işlenmemiş rakamlardan göründüğü kadar iyi değildir.

Karışıma GPU eklerseniz, performans elde etmek için tüm bu işleri düzenlemek daha da zorlaşacaktır. Bu, birkaç ay içinde Kafes QCD Yüksek Lisans Tezi'mde yapmaya başlayacağım şeylerden biri olacak.


1

Mozilla Research'te geliştirilmekte olan Servo tarayıcı motorunu ve özellikle de Web Oluşturucusu'nu (video) incelemekle ilgilenebilirsiniz .

Bir görevi CPU'dan GPU'ya dinamik olarak kaydırırken, diğer cevaplarda (özellikle @ Philip'in yaptığı gibi) bahsedildiği gibi pratik olmayabilir, CPU / GPU'nun tipik iş yükleri üzerindeki yükünü önceden incelemek ve bazı işleri genel olarak daha az yüklü hale getirmek pratik olabilir. bir.

Web Oluşturucusu durumunda, yenilik, geleneksel olarak tarayıcıların işlem yapma işlemlerinin çoğunu CPU üzerinde gerçekleştirmeleridir (yani, hangi nesnelerin görüntüleneceğini, nereye kesileceğini vb. Hesaplamak için CPU kullanılır ...). GPU normalde bu konuda daha iyidir ... ancak tüm kullanımların uygulanması önemsiz değildir (kısmi temizleme, gölgeler, ... ve metin).

Web Oluşturucu'nun ilk sürümü, performans artışında oldukça başarılı oldu, ancak metin oluşturma sorununu ele almaya çalışmadı (ve birkaç başka sınırlaması vardı). Mozilla Research şimdi, daha az sınırlaması olan ve özellikle de metin oluşturmayı desteklemek için tasarlanan ikinci bir sürüm üzerinde çalışıyor.

Tabii ki amaç, oluşturma işleminin mümkün olduğu kadarını GPU'ya boşaltmak, CPU'yu Javascript'i çalıştırmak, DOM'u güncellemek ve diğer tüm görevleri serbest bırakmak.

Dolayısıyla, öneriniz kadar aşırı olmasa da, hem CPU hem de GPU ile birlikte bir hesaplama stratejisi tasarlama yönüne gider .


0

Oyunlara odaklanarak (özellikle görevinizde belirttiğinizden beri), yükü dengelemenizin bazı yolları vardır. Örnek olarak "skinning", yani bir model canlandırıyor. Oluşturulacak her kare için, her animasyon karesi için dönüşüm matrislerini oluşturmalı ve onu, olması gereken poz haline dönüştürmek için modelin köşelerine uygulamalısınız. , eğer animasyonunuzun orijinal Quake'e (yani sarsıntılı) benzemesini istemiyorsanız.

Bu durumda, bunu CPU'da yapabilir ve sonuçları render için GPU'ya yükleyebilir veya GPU'da hesaplama ve render işlemini yapabilirsiniz. Bugünlerde GPU'da yapıldığına inanıyorum ("donanım zarı" olarak da bilinir): Binlerce kez yapılması gereken nispeten basit hesaplamalara sahip olmanız ve bunun sonucunda her köşe eşzamanlı olarak hesaplanabilmesi nedeniyle, bunun mantıklı olduğunu düşünüyorum. A köşesinin B köşesinin sonucuna hiçbir etkisi yoktur.

Bununla birlikte teoride, GPU ve CPU’nun ne kadar aşırı yüklendiğine bağlı olarak CPU veya GPU’da dinamik olarak geçiş yapabilirsiniz.

Tüm hesaplamalar boyunca bunu yapmanın ana engelleyicisi CPU ve GPU'nun farklı güçlü ve zayıf yönlerinin olmasıdır. Büyük ölçüde paralel işler GPU'da daha iyi yapılırken, dallanma içeren yoğun doğrusal işler CPU'da daha iyi yapılır. Yalnızca birkaç iş, ciddi bir performans düşmesi olmadan her ikisinde de gerçekçi bir şekilde yapılabilirdi.

Genel olarak, GPU programlamasındaki ana sorun (en azından OpenGL ve DirectX 11 ve altında), GPU’nun shader kodunuzu nasıl yorumladığı üzerinde çok az kontrol sahibi olmanızdır. Bir gölgelendirici içinde dallanma risklidir, çünkü hesaplamalar arasında yanlışlıkla bir bağımlılık yaratırsanız, GPU, piksellerinizi birer birer birer oluşturmaya başlayarak karar verilmesine rağmen gerçek veriler aynı olmasına rağmen anında 60 fps'yi 10 fps'ye çevirmeye karar verebilir.


0

Gerçek bir dünya örneği, aynı anda bir CPU ve GPU'yu tam olarak yükleyebilen açık kaynaklı LuxRender renderleme motorudur. Ek olarak, aynı anda birden fazla GPU yükleyebilir ve birden fazla bilgisayara dağıtabilir.

LuxRender bunu kolaylaştırmak için OpenCL kullanıyor , ancak OpenCL olmadan yapılan kurulumlar da mevcut.

Bu pratiktir, çünkü LuxRender'ın kullandığı algoritmalar oldukça paraleldir. LuxRender'ın kullandığı en yaygın algoritma , birçok bireysel ışık yolunun birbirinden bağımsız olarak hesaplanabileceği yol izlemedir - GPU hesaplama için ideal bir durumdur ve biri hesaplama düğümleri arasında karmaşık senkronizasyon gerektirmez. Bununla birlikte, GPU'ların sınırlamaları (daha düşük bellek miktarları, bazı karmaşık görüntü oluşturma özellikleri için destek eksikliği ve bazı sanatçıların genel olarak bulunmaması) CPU desteğinin hala gerekli olmasını sağlar.


Bu imajı göstermenin amacı nedir, sorulan soru ile ne alakası var?
gnat

1
Ehh iyi. Onu sileceğim. Ne tür bir yazılım olduğunu kolayca göstereceğini düşünüyordum. Ama belki de sadece gerçekten rahatsız edici. (Pek çok farklı render motoru var; bu fotogerçekçi fotoğrafları hedef alıyor.)
PythonNut

0

Evet, kesinlikle mümkün.

Bir CPU'nun yapabildiği herhangi bir hesaplama, bir GPU da yapabilir ve bunun tersi de geçerlidir.

Ancak nadirdir, çünkü:

  • Mühendislik karmaşıklığı Aynı kodu bir CPU ve GPU'da (örneğin CUDA) çalıştırmak mümkün olsa da, işlemciler farklı yeteneklere ve performans özelliklerine sahiptir. Biri MIMD'dir; diğer, SIMD. Birinde hızlı olan şey diğerinde yavaştır (ör. Dallanma), bu nedenle performansı en üst düzeye çıkarmak için ayrı kod yazmanız gerekir.

  • Maliyet verimliliği GPU'lar toplamda CPU'lardan çok daha güçlü. GPU'ların tüm fikri, aynı maliyet için CPU'lardan çok daha hızlı hesaplamalar yapmak için daha ucuz, daha yavaş, ancak daha çok sayıda işlemci kullanmaktır. GPU'lar, bir veya iki büyüklük sırasına göre maliyet açısından daha verimlidir.

Algoritmanızın GPU'larda çalışmasını sağlarsanız, bunlar için optimizasyon yapmak daha fazla anlam ifade eder ve ihtiyaç duyduğunuz kadarını ekler.

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.