SORU
6 Mart 2010, CUMARTESİ


Anlayış CUDA ızgara boyutları, blok boyutları ve ipler Örgütü (basit açıklama)

Nasıl bir GPU iş parçacığı tarafından yürütülecek düzenlenir?

CEVAP
6 Mart 2010, CUMARTESİ


Donanım

Eğer bir GPU aygıtı vardır, örneğin, 4 Çoklu işlem birimleri, ve onlar çalıştırmak 768 konuları her: o zaman bir an fazla 4*768 konuları olacak gerçekten çalışan paralel (eğer planlı daha fazla iş parçacığı, onlar bekleme sırası).

Yazılım

konuları bloklar halinde düzenlenir. Bir blok Çoklu işlem birimi tarafından yürütülür. Bu konuları bir blok olabilir tanımlanan (endeksli) kullanarak 1Dimension(x), 2Dimensions (x,y) veya 3Dim dizin (x,y,z) ama ne olursa olsun x*y*z <= 768 bizim için örnek (diğer restriccions uygulamak için x,y,z, görmek kılavuzu ve aygıt özelliği).

Eğer daha fazla ihtiyacınız varsa, büyük ihtimalle 4*768 threads 4 bloktan gerekiyor. Bloklar da 1D, 2D veya 3D endeksli olabilir. Blok girmek için bekleyen bir kuyruk var GPU (çünkü, bizim örneğimizde, GPU 4 çoklu işlemcili ve sadece 4 blok vardır yürütülen eş zamanlı olarak).

Şimdi basit bir örnek: işleme 512x512 bir görüntü

Bir iş parçacığı bir pikselin (i,j) işlemi için istediğimiz varsayalım.

64 iş parçacığı her bloklarını kullanabiliriz. = 4096 512*512/64 blok ihtiyacımız var o zaman (512x512 konuları = 64*4096 var)

Ortak (dizin resmi kolaylaştırmak için) 2D bloklar = 8 blockDim sahip x 8 (blok başına 64 konuları) konuları organize etmek. Bu threadsPerBlock demeyi tercih ederim.

dim3 threadsPerBlock(8, 8);  // 64 threads

ve 2D gridDim = 64 x 64 blok (4096 blokları gerekli). Bu numBlocks demeyi tercih ederim.

dim3 numBlocks(imageWidth/threadsPerBlock.x,  /* for instance 512/8 = 64*/
              imageHeight/threadsPerBlock.y); 

Çekirdek böyle başlattı

myKernel <<<numBlocks,threadsPerBlock>>>( /* params for the kernel function */ );       

Nihayet: "4096 blok sıra", bir blok 64 parçacıklarını idam almak için GPU çoklu işlemcili bir atanmasını bekliyor. böyle bir şey olacak

Çekirdek (ı,j) bir iş parçacığı tarafından işlenecek piksel bu şekilde hesaplanır:

uint i = (blockIdx.x * blockDim.x)   threadIdx.x;
uint j = (blockIdx.y * blockDim.y)   threadIdx.y;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • MkElite

    MkElite

    13 NİSAN 2012
  • RyanXLT

    RyanXLT

    22 Ocak 2011