__global__
Ve arasındaki farkları açıklayan var __device__
mı?
Ne zaman __device__
ve ne zaman kullanmalıyım __global__
?
__global__
Ve arasındaki farkları açıklayan var __device__
mı?
Ne zaman __device__
ve ne zaman kullanmalıyım __global__
?
Yanıtlar:
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.
__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.
__global__
- CPU veya GPU'dan çağrılan GPU üzerinde çalışır *. Bağımsız <<<dim3>>>
değişkenlerle yürütülür .__device__
- GPU'dan çağrılan GPU'da çalışır. Değişkenlerle de kullanılabilir.__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
.
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ı.
Şimdilik burada bazı asılsız spekülasyonları kaydediyorum (bunları daha sonra yetkili bir kaynakla karşılaştığımda doğrulayacağım) ...
__device__
işlevler void dışında bir dönüş türüne sahip olabilir, ancak __global__
işlevler her zaman void döndürmelidir.
__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 .
__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.
__global__
CUDA C anahtar kelimesidir (bildirim belirteci), fonksiyonun,
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__
.
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
__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.