GPU'lar hangi istatistiksel yöntemler için CPU'lardan daha hızlıdır?


18

Masaüstüme bir Nvidia GT660 grafik kartı taktım ve bazı mücadelelerden sonra R ile arayüz kurmayı başardım.

GPU'ları, özellikle gputools'u kullanan birkaç R paketiyle oynuyordum ve bazı temel işlemleri yapmak için GPU ve CPU'mun aldığı zamanı karşılaştırıyordum:

  • ters matrisler (CPU daha hızlı)
  • qr ayrışması (CPU daha hızlı)
  • büyük korelasyon matrisleri (CPU daha hızlı)
  • matris çarpımı (GPU çok daha hızlı!)

Özellikle gputools ile denediğime dikkat edin, bu yüzden belki de diğer paketler daha iyi performans gösterir.

Geniş anlamda sorum şu: CPU yerine GPU üzerinde çalışmaya değer olabilecek rutin istatistiksel işlemler nelerdir?


1
Çok fazla matris çarpımı içeren bir şey var mı? :) GPU'lar sinir ağları topluluğunda oldukça popülerdir.

ilgili matrislerin boyutunu sağlamanız gerekir. Örneğin, son kontrol (kuşkusuz 2 yıl önce) inversiyon ve ayrışma, büyük matrislerden (2 ^ 9 çarpı 2 ^ 9 ve üstü) başlayan GPU'da yalnızca daha hızlıydı
user189035 24:13

1
İnversiyon, qr ve matris çarpımı için yaklaşık matrisler kullandım , korelasyonlar için 100 büyüklüğünde vektörlerin yaklaşık 10 ^ 4 gözlemini kullandım. Matris inversiyonu için GPU çok daha yavaştı, qr ayrışması için ise daha yavaş fakat CPU ile karşılaştırılabilir. 103×103
Jugurtha

2
Bu çok iyi bir soru ama sanırım stackoverflow'a geçirerek daha iyi cevaplar alacaksınız (benzer soruların daha önce orada sorulduğunu düşünüyorum)
user189035

2
GPU'nun normal CPU'ların avantajı, çekirdek başına daha hızlı olmaları değil, "büyük ölçüde" paralel olabilmeleridir. Bu nedenle, Cholesky çarpanlara ayırma vb. Gibi bir çok "temizlik" gerektiren işler için, önemli hızlanma elde etmek için blok algoritmaları kullanmanız gerekir; bu önemsiz değildir ve GPU'nun bu tür işlemleri devralması biraz zaman alacaktır. Kesinlikle GPU yoluna giden şey MCMC-ing (ve Rastgele Sayı üretme). Bir posteriordan örneklemenin her yerinde "paralelleştirme" vardır ... Ve seyrek matris hesaplamaları; zaten zaten "bloke" ...
usεr11852 diyor Reinstate Monic

Yanıtlar:


6

GPU'lar hassas hayvanlardır. Her ne kadar Nvidia'nın en iyi kartı teorik olarak en hızlı CPU'dan 100 kat daha hızlı listelediğiniz işlemleri yürütebilse de, yaklaşık bir milyon şey bu hızlanmanın önüne geçebilir. İlgili algoritmanın ve onu çalıştıran programın her kısmı, bu teorik maksimum hızlandırmaya yakın bir yere ulaşmak için kapsamlı bir şekilde ayarlanmalı ve optimize edilmelidir. R'nin özellikle hızlı bir dil olduğu bilinmemektedir ve bu nedenle varsayılan GPU uygulamasının en azından ham performans açısından o kadar da büyük olmadığı beni şaşırtmaz. Bununla birlikte, R GPU işlevleri, eksik performansın bir kısmını yeniden kazanmak için ayarlayabileceğiniz optimizasyon ayarlarına sahip olabilir.

GPU'lara bakıyorsanız, çalıştırmanız gereken bazı hesaplamaların tamamlanması haftalar / aylar alacaktır, R'den daha performans dostu bir dile geçmek için zaman ayırmaya değer olabilir. Python ile çalışmak çok daha zor değil. NumPy ve SciPy paketleri R ile aynı stat işlevlerinin çoğuna sahiptir ve PyCuda kendi GPU tabanlı işlevlerinizi oldukça basit bir şekilde uygulamak için kullanılabilir.

Eğer varsa gerçekten senin fonksiyonları GPU'ları üzerinde çalışan hızını artırmak isteyen, ben C ++ ve CUDA bir arada kendi fonksiyonlarını uygulayan ele alacak. CUBLAS kütüphanesi, cebirle ilgili tüm lineer ağır kaldırmaları işlemek için kullanılabilir. Bununla birlikte, bu tür bir kod yazmanın oldukça uzun zaman alabileceğini unutmayın (özellikle ilk defa yapıyorsanız) ve bu nedenle bu yaklaşımın yalnızca çalıştırılması çok uzun süren hesaplamalar için ayrılması gerekir (ay) ve / veya yüzlerce kez tekrar edeceğinizi.


6

Geniş anlamda, GPU'da daha hızlı çalışan algoritmalar, birçok farklı veri noktasında aynı tür talimatlar yaptığınız algoritmalardır.

Bunu açıklamak için kolay bir örnek matris çarpımıdır.

Matris hesaplamasını yaptığımızı varsayalım

birxB=C

Basit bir CPU algoritması şuna benzeyebilir

// C = 0 ile başlayan

for (int i = 0; i < C_Width; i++)
{
    for (int j = 0; j < C_Height; j++)
    {
        for (int k = 0; k < A_Width; k++)
        {
            for (int l = 0; l < B_Height; l++)
            {
                C[j, i] += A[j, k] * B[l, i];
            }
        }
    }
}

Burada görülmesi gereken en önemli şey, döngüler için çok fazla iç içe geçmiş olması ve her adımın birbiri ardına gerçekleştirilmesi gerektiğidir.

Bunun bir şemasına bakın

Her bir C elemanının hesaplanmasının diğer elemanlardan hiçbirine bağlı olmadığına dikkat edin. Bu nedenle, hesaplamaların hangi sırada yapıldığı önemli değildir.

GPU'da, bu işlemler aynı anda yapılabilir.

Matris çarpımını hesaplamak için bir GPU çekirdeği,

__kernel void Multiply
(
    __global float * A,
    __global float * B,
    __global float * C
)
{
     const int x = get_global_id(0);
     const int y = get_global_id(1);
     for (int k = 0; k < A_Width; k++)
     {
         for (int l = 0; l < B_Height; l++)
         {
             C[x, y] += A[x, k] * B[l, y];
         }
     }
}

Bu çekirdek döngüler için sadece iki iç kısma sahiptir. Bu işi GPU'ya gönderen bir program, GPU'ya C'deki her veri noktası için bu çekirdeği yürütmesini söyler. GPU, bu talimatların her birini aynı anda birçok iş parçacığında yapacaktır. Tıpkı eski "Düzine tarafından daha ucuz" deyimi gibi GPU'lar aynı şeyi birçok kez daha hızlı yapmak üzere tasarlanmıştır.

Bununla birlikte, GPU'yu yavaşlatacak bazı algoritmalar vardır. Bazıları GPU için uygun değildir.

Örneğin, veri bağımlılıkları varsa, yani: C'nin her bir elemanının, önceki elemanlara bağlı olarak hesaplandığını hayal edin. Programcı, önceki hesaplamaların tamamlanmasını beklemek için çekirdeğe bir bariyer koymak zorunda kalacaktı. Bu büyük bir yavaşlama olurdu.

Ayrıca, çok fazla dallanma mantığına sahip algoritmalar yani:

__kernel Foo()
{
    if (somecondition)
    {
        do something
    }
    else
    {
        do something completely different
    }
}

GPU artık her iş parçacığında aynı şeyi yapmadığı için GPU'da daha yavaş çalışma eğilimindedir.

Bu basitleştirilmiş bir açıklamadır çünkü dikkate alınması gereken birçok faktör vardır. Örneğin, CPU ve GPU arasında veri göndermek de zaman alıcıdır. Bazen ekstra gönderme süresinden kaçınmak için, CPU'da daha hızlı olduğunda bile GPU'da bir hesaplama yapmaya değer (ve tersi).

Ayrıca birçok modern CPU, hiper iş parçacıklı çok çekirdekli işlemcilerle eşzamanlılığı da destekliyor.

GPU'lar da özyineleme için o kadar iyi görünmüyor, muhtemelen QR algoritmasıyla ilgili bazı sorunları açıklayan buraya bakın . Kişinin bazı özyinelemeli veri bağımlılıkları olduğuna inanıyorum.


2
Resmi olarak SX-yaramaz, sadece müthiş bir cevap olduğunu söylemek için bir cevap hakkında yorum yapmak, ama bir sıçanın hatalar hakkında perinæum vermiyorum: Bu hoş ve bilgilendirici bir cevap. SX'in büyük haksızlıklarından biri, 'eski' (internet zamanında) sorular hakkında mükemmel bilgilendirici cevaplar veren insanlara kudos eksikliği. (Artı, 'eski' (internet zamanında) cevabını beğeniyorum: Biliyorum, değil mi? META).
GT.

Önemli bir husus, aslında hesaplamayı yapacak bir kütüphane olup olmadığıdır: örneğin, bildiklerime göre, matris çarpımının seyrek x yoğun GPU uygulamaları yoktur, kesinlikle R paketleri yoluyla değil. GPU C kodu yazma ile çalışmaya hazırsanız, iyi şanslar.
Jack Wasey

4

Bahsettiğiniz tüm uygulamalar için GPU'lar, yeterince büyük matrisler için CPU'lardan daha yetenekli olmalıdır (donanım açısından). Ben R'ın uygulaması hakkında hiçbir şey bilmiyorum, ama ben kullandım cuBLAS ve Magma etrafında inversiyon için büyük bir başarı ilen=210 ve dikdörtgen matrisler için çarpma / korelasyon n,m210,k214. Büyük korelasyon matrislerinin R kullanan CPU'da daha hızlı olması benim için özellikle büyük bir sürpriz.

Daha genel olarak, zamanlarının çoğunu yoğun lineer cebirde geçiren (BLAS, Lapack işlevselliği) çoğu istatistiksel işlemin GPU üzerinde etkili bir şekilde uygulanabileceğinden şüpheleniyorum.


0

Eksik Veriler için Çoklu Imputation yöntemleri? Alice-II (R) 'deki gibi.

Bence bunlar genellikle utanç verici bir şekilde paralel ve dolayısıyla bir GPU mimarisine uygun olma eğilimindedir. Asla kendim denedim.

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.