Adakah yang bisa menjelaskan perbedaan antara __global__
dan __device__
?
Kapan saya harus menggunakan __device__
, dan kapan menggunakan __global__
?.
Adakah yang bisa menjelaskan perbedaan antara __global__
dan __device__
?
Kapan saya harus menggunakan __device__
, dan kapan menggunakan __global__
?.
Jawaban:
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.
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 mendeklarasikan void 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.
__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 mulai
kemampuan komputasi 3.5.
Saya akan menjelaskannya dengan contoh:
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
}
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.
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.
__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.
__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__
.
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
__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.