Adakah yang bisa menjelaskan perbedaan antara __global__
dan __device__
?
Kapan saya harus menggunakan __device__
, dan kapan menggunakan __global__
?.
Fungsi global juga disebut "kernel". Ini adalah fungsi yang dapat Anda panggil dari sisi host menggunakan semantik panggilan kernel CUDA ( <<<...>>>
).
Fungsi perangkat hanya dapat dipanggil dari perangkat lain atau fungsi global. __device__
fungsi tidak dapat dipanggil dari kode host.
__global__
fungsi juga dapat dipanggil dari perangkat menggunakan semantik kernel CUDA (<<< ... >>>) jika Anda menggunakan paralelisme dinamis - yang memerlukan CUDA 5.0 dan kemampuan komputasi 3.5 atau lebih tinggi.Perbedaan antara
__device__
dan__global__
fungsi adalah:__device__
fungsi hanya dapat dipanggil dari perangkat, dan hanya dijalankan di perangkat.__global__
fungsi dapat dipanggil dari host, dan dijalankan di perangkat.Oleh karena itu, Anda memanggil
__device__
fungsi dari fungsi kernel, dan Anda tidak perlu menyetel pengaturan kernel. Anda juga dapat "membebani" suatu fungsi, misalnya: Anda dapat mendeklarasikanvoid foo(void)
dan__device__ foo (void)
, kemudian fungsi tersebut dijalankan pada host dan hanya dapat dipanggil dari fungsi host. Yang lainnya dijalankan pada perangkat dan hanya dapat dipanggil dari perangkat atau fungsi kernel.Anda juga dapat mengunjungi tautan berikut: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , ini berguna bagi saya.
sumber
__global__
- Berjalan di GPU, dipanggil dari CPU atau GPU *. Dieksekusi dengan<<<dim3>>>
argumen.__device__
- Berjalan di GPU, dipanggil dari GPU. Bisa digunakan dengan variabiles juga.__host__
- Berjalan di CPU, dipanggil dari CPU.*)
__global__
fungsi dapat dipanggil dari__global__
fungsi lain mulaikemampuan komputasi 3.5.
sumber
Saya akan menjelaskannya dengan contoh:
yaitu ketika kita menginginkan fungsi host (CPU) untuk memanggil fungsi perangkat (GPU), maka ' global ' digunakan. Baca ini: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "
Dan ketika kita menginginkan fungsi perangkat (GPU) (bukan kernel) untuk memanggil fungsi kernel lain, kita menggunakan ' perangkat '. Baca " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions " ini
Ini seharusnya cukup untuk memahami perbedaannya.
sumber
__global__
adalah untuk kernel cuda, fungsi yang dapat dipanggil dari host secara langsung.__device__
fungsi dapat dipanggil dari__global__
dan__device__
fungsi tetapi tidak dari host.sumber
Saya merekam beberapa spekulasi yang tidak berdasar di sini untuk saat ini (saya akan memperkuatnya nanti ketika saya menemukan beberapa sumber otoritatif) ...
__device__
fungsi dapat memiliki tipe kembalian selain void tetapi__global__
fungsi harus selalu mengembalikan void.__global__
fungsi dapat dipanggil dari dalam kernel lain yang berjalan pada GPU untuk meluncurkan utas GPU tambahan (sebagai bagian dari model paralelisme dinamis CUDA (alias CNP)) sementara__device__
fungsi berjalan pada utas yang sama dengan kernel pemanggil.sumber
__global__
fungsi adalah definisi kernel. Setiap kali dipanggil dari CPU, kernel itu diluncurkan di GPU.Namun setiap utas yang menjalankan kernel itu, mungkin perlu mengeksekusi beberapa kode lagi dan lagi, misalnya menukar dua bilangan bulat. Jadi, di sini kita bisa menulis fungsi pembantu, seperti yang kita lakukan di program C. Dan untuk utas yang dijalankan pada GPU, fungsi pembantu harus dideklarasikan sebagai
__device__
.Jadi, fungsi perangkat dipanggil dari utas kernel - satu contoh untuk satu utas. Sedangkan fungsi global dipanggil dari CPU thread.
sumber
__global__
adalah kata kunci CUDA C (penentu deklarasi) yang mengatakan bahwa fungsinya,fungsi global (kernel) diluncurkan oleh kode host menggunakan
<<< no_of_blocks , no_of threads_per_block>>>
. Setiap utas mengeksekusi kernel dengan id utas uniknya.Namun,
__device__
fungsi tidak dapat dipanggil dari kode host. Jika Anda perlu melakukannya gunakan keduanya__host__
__device__
.sumber
Fungsi Global hanya dapat dipanggil dari host dan tidak memiliki tipe kembalian sedangkan Fungsi Perangkat hanya dapat dipanggil dari fungsi kernel pada fungsi Perangkat lain sehingga tidak memerlukan pengaturan kernel
sumber