Ne zaman işi CPU yerine bir GPU'ya boşaltmalıyım?


16

Grafik işlemcilerimizde gittikçe daha fazla kod çalıştırabilmemiz için OpenCL gibi daha yeni sistemler yapılıyor, bu da mantıklı, çünkü sistemlerimizdeki gücü olabildiğince kullanabilmeliyiz.

Ancak, tüm bu yeni sistemlerde, GPU'lar her şekilde CPU'lardan daha iyi gibi görünüyor . GPU'lar paralel hesaplama yapabildiğinden, çok çekirdekli GPU'lar aslında çok çekirdekli CPU'lardan çok daha iyi gibi görünüyorlar; aynı anda birçok hesaplama yapabilir ve hızı gerçekten artırabilirsiniz. Seri işlemenin hala paralelden daha iyi, daha hızlı ve / veya daha verimli olduğu bazı durumlar var mı?



6
Gerçekten donanım hakkında bir soru değil. "CPU (ları) programlarken GPU'ları programlamaktan daha iyi" olarak yeniden yazılabilir ve bu oldukça iyi bir p.se sorusudur. SO'daki diğerleri arasında GPGPU etiketine bakın. Ama mimarlık "Hangi teknoloji kullanılacak" soruları burada olduğundan daha iyidir.
Kate Gregory

1
@Kate Bu açı bağlantılı Süper Kullanıcı sorusunda çok iyi ele alınmış gibi görünüyor. Bunu okurken, dürüst olmak gerekirse buraya taşınmamasına biraz şaşırdım. SO'da da bu var. Soruyu yeniden açacağım (haklı olduğunuz için, bunun programlama yönleri burada konudur). Umarım sadece bu sorunun mevcut (mükemmel) kapsamına işaret etmeyen bir cevap görürüz.
Adam Lear

1
@ Anna'nın görüşüne göre, bir programcının GPU ve CPU arasındaki farkın ne olduğunu tamamen teorik bir tartışmadan ziyade, bir programcının GPU'yu ne zaman kullanması gerektiğine dair cevapların çok daha fazla olması gerektiğini düşünüyorum. Bunu yansıtmak için başlığı düzenledim.

2
@RetroX Soruları farklı sitelerdeyse kopya olarak kapatamayız.
Adam Lear

Yanıtlar:


27

Ancak, tüm bu yeni sistemlerde, GPU'lar her şekilde CPU'lardan daha iyi gibi görünüyor.

Bu temel bir yanlış anlamadır. Mevcut GPU çekirdekleri, mevcut en üst düzey CPU'lara kıyasla hala sınırlıdır. NVIDIA'nın Fermi mimarisinin şu anda mevcut olan en güçlü GPU olduğunu düşünüyorum. Tamsayı aritmetiği için sadece 32 bit kayıtlara ve geçerli bir emtia Intel işlemcisinden sonra dal tahmini ve spekülatif yürütme için daha az kapasiteye sahiptir. Intel i7 yongaları üç önbellek seviyesi sağlar, Fermi çekirdeklerinde sadece iki tane vardır ve Fermi'deki her önbellek i7'deki ilgili önbellekten daha küçüktür. GPU çekirdekleri arasındaki süreçler arası iletişim oldukça sınırlıdır ve hesaplamalarınızın bu sınırlamaya uyacak şekilde yapılması gerekir (çekirdekler bloklar halinde birleştirilir ve bir bloktaki çekirdekler arasındaki iletişim nispeten hızlıdır, ancak bloklar arasındaki iletişim yavaştır).

Mevcut GPU'ların önemli bir sınırlaması, çekirdeklerin hepsinin aynı kodu çalıştırması gerektiğidir. CPU'nuzdaki çekirdeklerden farklı olarak, bir GPU çekirdeğinden e-posta istemcinizi çalıştırmasını ve başka bir çekirdeği web sunucunuzu çalıştırmasını söyleyemezsiniz. GPU'ya bir matrisi ters çevirme işlevi verirsiniz ve tüm çekirdekler bu işlevi farklı veri bitlerinde çalıştırır.

GPU'daki işlemciler izole bir dünyada yaşıyorlar. Ekranı kontrol edebilirler, ancak diske, ağa veya klavyeye erişimi yoktur.

GPU sistemine erişim, önemli genel masraflara sahiptir. GPU'nun kendi belleği vardır, bu nedenle hesaplamalarınız GPU kartındaki bellek miktarı ile sınırlı olacaktır. GPU belleği ile ana bellek arasında veri aktarımı nispeten pahalıdır. Pragmatik olarak bu, CPU'dan GPU'ya bir avuç kısa hesaplamanın yapılmasının faydası olmadığı anlamına gelir, çünkü kurulum ve sökme maliyetleri hesaplamayı yapmak için gereken süreyi azaltacaktır.

Sonuç olarak, GPU'ların paralel olarak hesaplanabilecek uzun bir hesaplamanın çok sayıda (yüzlerce veya binlerce) kopyaları olduğunda yararlı olmalarıdır. Bunun yaygın olduğu tipik görevler bilimsel hesaplama, video kodlama ve görüntü oluşturmadır. Metin düzenleyici gibi bir uygulama için, GPU'nun yararlı olabileceği tek işlev, ekranda türü oluşturmaktır.


çift ​​hassasiyetli destek Shader Model 5'in bir parçasıdır ve AMD / ATI'de de vardır.
Ben Voigt

@ Ben, düzeltme için teşekkürler. Yanlış ifadeyi kaldırdım.
Charles E. Grant

11

GPU'lar CPU'ların genel işlemcisi değildir. Çok özel bir şey yapma konusunda uzmanlaşıyorlar - aynı kodu büyük miktarda veriye uyguluyorlar - ve bunu bir CPU'dan çok çok iyi yapıyorlar. Ancak çoğu uygulamanın çoğu aynı kodu büyük miktarda veriye uygulamakla ilgili değildir; bir olay döngüsü ile ilgilidir: girişi beklemek, girişi okumak, ona göre hareket etmek ve daha fazla girişi beklemek. Bu oldukça seri bir süreç ve GPU'lar "seri" yi emiyor.

İşlemeniz gereken büyük miktarda veriye sahip olduğunuzda ve her bir öğe diğerlerinden bağımsız olarak paralel olarak işlenebilir, ardından devam edin ve GPU'ya gönderin. Ama bunu her şeyin içine girmesi gereken "yeni paradigma" olarak düşünmeyin.

Bu soru "optimizasyon" olarak etiketlendi, bu yüzden bir tane gibi davranmayı unutmayın. Test ve profil oluşturmanın, optimizasyonun gerekli olduğunu ve görevin niteliğinin GPU optimizasyonunun uygulanabileceği şekilde olduğunu gösteren GPU optimizasyonunu uygulayın. Aksi takdirde, zahmet etmeyin, çünkü bu, düzeltmekten daha fazla soruna neden olan erken veya yanlış optimizasyon olacaktır.


8

Basit cevap, bir GPU'nun çok sayıda öğenin her biri üzerinde oldukça küçük, oldukça basit bir hesaplama yapmanız gerektiğinde en iyi şekilde çalışmasıdır. Bu şekilde çok şey başarmak için, her kalem için hesaplama diğer kalem için hesaplamadan bağımsız olmalıdır. Bir öğe ile diğeri arasında (normalde) bir miktar bağımlılık varsa, genellikle GPU'da bu kodu yürütmeden çok fazla şey elde etmeden önce onu kırmanın bir yolunu bulmanız gerekir. Bağımlılık tamamen kırılamıyorsa veya kırılması için çok fazla iş gerekiyorsa, kod CPU'da daha hızlı çalışabilir.

Mevcut CPU'ların çoğu, mevcut GPU'ların desteklemeye çalışmadığı birkaç işlemi de destekler (örn. Çoklu görev için bellek koruması).

Biraz farklı bir yönden baktığımızda, CPU'lar (büyük ölçüde) programcılar için makul derecede uygun olacak şekilde tasarlandı ve donanım kullanıcıları, ancak yine de mümkün olduğunca çabuk çalışır.

GPU'lar oldukça ters yönden şeylere gelir: büyük ölçüde donanım tasarımcısı için uygun olacak şekilde tasarlanmıştır ve OpenCL gibi şeyler, donanımın kısıtlamaları göz önüne alındığında, mümkün olduğunca makul bir programlama modeli sağlamaya çalışmıştır.

GPU'da çalıştırmak için kod yazmak genellikle CPU'da aynı işlemi yapmaktan daha fazla zaman ve çaba gerektirir (bu yüzden daha pahalıya mal olur). Bu nedenle, bunu yapmak öncelikle /

  1. Sorun o kadar paralel ki minimum çabadan büyük bir kazanç bekleyebilirsiniz, ya da
  2. Hız kazancı o kadar önemlidir ki, bir sürü ekstra işi haklı çıkarır.

Her biri için bazı belirgin olasılıklar vardır - ancak çok sayıda uygulama açıkça her ikisine de yakın değildir. Yakın zamanda bir GPU'da çalışan bir CRUD uygulamasını görmekten oldukça şaşırırım (ve eğer yaparsa, muhtemelen birileri en iyi yaklaşan herhangi bir şeye değil, tam olarak bu hedefe dikkat ederek yola çıkacaktır. maliyet / fayda oranı).

Gerçek şu ki, bir çok ("çoğu" demeye cazipim) uygulamalar için tipik bir CPU yeterince hızlı değildir ve programlama kolaylığı (yeni özelliklerin daha kolay geliştirilmesi gibi şeylere yol açmak) çok daha önemlidir. yürütme hızı.


3

aynı anda birçok hesaplama yapabilir ve hızı gerçekten artırabilirsiniz.

hızı artırmak? ne olmuş yani? Geçen yıl boyunca ihtiyaç duyulduğunda sadece bir veya iki kez hatırlayabilirim. Ben oldum Çoğu zaman vs vs sadece kullanıcı etkileşimini artırmak için, farklı bir veri kaynağı için ayarlamak için, değiştirmek veya düzeltme mantığı istedi hız müşterilerin bu durumlarda ilgilenen edildi değişiklik yapma hızı oldu. "Lütfen yeni özelliği bir ay içinde veya daha iyisi - iki hafta içinde yayınlayın".

Beni yanlış anlamayın - kodlayıcı olarak CPU kenelerini iyice sıkmaktan zevk alıyorum. Sadece bu sanat tipik olarak yüksek talep görmüyor.

Seri işlemenin hala paralelden daha iyi, daha hızlı ve / veya daha verimli olduğu bazı durumlar var mı?

Çok sayıda dava olduğunu söyleyebilirim. Seri işleme paralelden daha basittir, bu da hızın kritik bir gereklilik olmadığı her durumda daha verimli olmasını sağlar. Seri işleme, karmaşık mantık ve kullanıcı arabiriminin daha kolay uygulanmasına izin verir, belirtmek ve test etmek, korumak ve değiştirmek daha kolaydır.

Kural olarak, seri işlem, programcının niyetinin daha net bir şekilde ifade edilmesini ve kodun daha kolay okunmasını sağlar. Programın beyni olan en değerli ve az bulunan kaynağı kurtardığını söyleyebilirim.


2

İşlemciler hala çok yönlüdür. Örneğin, GPU'lar tek hassasiyette CPU'lardan daha verimlidir, ancak çift hassasiyette değildir. CPU'lar için GPU'lardan çok daha fazla kütüphane var.


3
Biraz daha ayrıntıya girebilir misin? Bunların doğruluğu hakkında hiçbir bilgi veya açıklama içermeyen üç ifade sundunuz.

Etkili çift kesinlikli hesaplamaların olmaması yaygın bir bilgidir: en.wikipedia.org/wiki/GPGPU
quant_dev

@quant: Bilgileriniz en az 2 yıl geçmiş: 544 GigaFLOPS herhangi bir genel CPU'dan çok daha hızlı.
Ben Voigt

@Ben, bağlantınızın çift hassasiyetli performanstan nerede bahsettiğini görmüyorum.
quant_dev


2

Basit kural, eğer yaptığınız şey lineer cebir yapıları olarak ifade edilebilirse ve zaman açısından kritik ise, GPU üzerinde yapın aksi takdirde CPU kullanın.

GPU'lar çok sayıda CPU'ya benzemez, çılgınca farklı performans özelliklerine sahiptirler.


"Zaman açısından kritik" ise, muhtemelen GPU'yu bir hesaplama gölgelendiricisi için yeniden yapılandıracak ve verileri yükleyecek zamanınız yoktur. En fazla yararı olan büyük problemler.
Ben Voigt

@Ben, bence "zaman kritik" farklı tanımlarımız var, yani hesaplamanın önemli bir süre için kritik yolda olduğu.
dan_waterworth

1

Ham sayı gıcırdatmaya ihtiyacınız varsa, GPU'lar gitmenin yoludur. Bununla birlikte, tüm bu ALU'lar, akış (dallanma) devresini kontrol etmeye ayrılmış daha az transistör olduğu anlamına gelir. Bu nedenle, çok karmaşık kontrol akışı, çok sayıda koşul vb. Gerektiren bir şey yazmanız gerekiyorsa, bir CPU daha hızlı olacaktır.

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.