Global ve cihaz işlevleri arasındaki fark


110

__global__Ve arasındaki farkları açıklayan var __device__mı?

Ne zaman __device__ve ne zaman kullanmalıyım __global__?

Yanıtlar:


137

Global işlevlere "çekirdekler" de denir. Bu, CUDA çekirdek çağrısı semantiğini ( <<<...>>>) kullanarak ana bilgisayar tarafından çağırabileceğiniz işlevlerdir .

Cihaz işlevleri yalnızca diğer cihazlardan veya genel işlevlerden çağrılabilir. __device__işlevler ana bilgisayar kodundan çağrılamaz.


14
Bir ek olarak, __global__CUDA 5.0 ve hesaplama kapasitesi 3.5 veya daha yüksek olan dinamik paralellik kullanıyorsanız, CUDA çekirdek semantiği (<<< ... >>>) kullanılarak işlevler cihazdan çağrılabilir.
Tom

39

__device__Ve __global__işlevleri arasındaki farklar şunlardır:

__device__ işlevler yalnızca cihazdan çağrılabilir ve yalnızca cihazda yürütülür.

__global__ işlevler ana bilgisayardan çağrılabilir ve cihazda çalıştırılır.

Bu nedenle, __device__işlevleri çekirdek işlevlerinden çağırırsınız ve çekirdek ayarlarını yapmanız gerekmez. Ayrıca bir işlevi "aşırı yükleyebilirsiniz", örneğin: void foo(void)ve __device__ foo (void)sonra bir tanesi ana bilgisayarda çalıştırılır ve yalnızca bir ana bilgisayar işlevinden çağrılabilir. Diğeri cihazda yürütülür ve yalnızca bir cihazdan veya çekirdek işlevinden çağrılabilir.

Ayrıca şu bağlantıyı da ziyaret edebilirsiniz: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , benim için yararlı oldu.


32
  1. __global__- CPU veya GPU'dan çağrılan GPU üzerinde çalışır *. Bağımsız <<<dim3>>>değişkenlerle yürütülür .
  2. __device__- GPU'dan çağrılan GPU'da çalışır. Değişkenlerle de kullanılabilir.
  3. __host__ - CPU'dan çağrılan CPU üzerinde çalışır.

*) __global__işlevler, işlem yeteneği 3.5'i __global__başlatan diğer işlevlerden çağrılabilir
.


5
Bu cevap biraz geç kalmıştır - soru sorulduğu sırada doğruydu, ancak dinamik paralelliğin icadından bu yana artık doğru değil .
tera

16

Bunu bir örnekle açıklayacağım:

main()
{
    // Your main function. Executed by CPU
}

__global__ void calledFromCpuForGPU(...)
{
  //This function is called by CPU and suppose to be executed on GPU
}

__device__ void calledFromGPUforGPU(...)
{
  // This function is called by GPU and suppose to be executed on GPU
}

Örneğin, bir ana bilgisayar (CPU) işlevinin bir aygıt (GPU) işlevini çağırmasını istediğimizde, ' global ' kullanılır. Şunu okuyun: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

Ve bir aygıt (GPU) işlevinin (çekirdek yerine) başka bir çekirdek işlevini çağırmasını istediğimizde ' aygıt ' kullanırız. Bu " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions " bölümünü okuyun

Farkı anlamak için bu yeterli olmalı.


13

__global__doğrudan ana bilgisayardan çağrılabilen işlevler olan cuda çekirdekleri içindir. __device__işlevler __global__ve __device__işlevlerinden çağrılabilir ancak ana bilgisayardan çağrılamaz.


7

Şimdilik burada bazı asılsız spekülasyonları kaydediyorum (bunları daha sonra yetkili bir kaynakla karşılaştığımda doğrulayacağım) ...

  1. __device__işlevler void dışında bir dönüş türüne sahip olabilir, ancak __global__işlevler her zaman void döndürmelidir.

  2. __global__işlevler __device__, çağıran çekirdekle aynı iş parçacığı üzerinde çalışırken ek GPU iş parçacığı başlatmak için (CUDA dinamik paralellik modelinin (CNP) bir parçası olarak) GPU üzerinde çalışan diğer çekirdeklerden çağrılabilir .


7

__global__işlev, çekirdeğin tanımıdır. CPU'dan her çağrıldığında, bu çekirdek GPU'da başlatılır.

Bununla birlikte, bu çekirdeği çalıştıran her iş parçacığı, bazı kodların tekrar tekrar çalıştırılmasını gerektirebilir, örneğin iki tam sayının değiş tokuşu. Böylece, burada bir C programında yaptığımız gibi bir yardımcı fonksiyon yazabiliriz. Ve GPU üzerinde çalışan iş parçacıkları için bir yardımcı işlev olarak bildirilmelidir __device__.

Böylelikle, bir çekirdeğin iş parçacıklarından bir aygıt işlevi çağrılır - bir iş parçacığı için bir örnek. Öte yandan, CPU iş parçacığından global bir işlev çağrılır.


7

__global__ CUDA C anahtar kelimesidir (bildirim belirteci), fonksiyonun,

  1. Cihazda yürütülür (GPU)
  2. Ana bilgisayar (CPU) kodundan çağrılar.

kullanılarak ana bilgisayar kodu tarafından başlatılan genel işlevler (çekirdekler) <<< no_of_blocks , no_of threads_per_block>>>. Her iş parçacığı, çekirdeği benzersiz iş parçacığı kimliği ile çalıştırır.

Ancak, __device__işlevler ana bilgisayar kodundan çağrılamaz. Yapmanız gerekiyorsa her ikisini de kullanın __host__ __device__.


2

Global Function yalnızca ana bilgisayardan çağrılabilir ve bir dönüş türüne sahip değilken, Aygıt İşlev yalnızca diğer Aygıt işlevinin çekirdek işlevinden çağrılabilir, bu nedenle çekirdek ayarı gerektirmez

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.