Perbedaan antara fungsi global dan perangkat

108

Adakah yang bisa menjelaskan perbedaan antara __global__dan __device__?

Kapan saya harus menggunakan __device__, dan kapan menggunakan __global__?.

Mehdi Saman Booy
sumber

Jawaban:

136

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.

Eugene
sumber
14
Hanya sebagai tambahan, __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.
Tom
39

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.

FacundoGFlores
sumber
31
  1. __global__- Berjalan di GPU, dipanggil dari CPU atau GPU *. Dieksekusi dengan <<<dim3>>>argumen.
  2. __device__- Berjalan di GPU, dipanggil dari GPU. Bisa digunakan dengan variabiles juga.
  3. __host__ - Berjalan di CPU, dipanggil dari CPU.

*) __global__fungsi dapat dipanggil dari __global__fungsi lain mulai
kemampuan komputasi 3.5.

Greşanu Emanuel - Vasile
sumber
5
Jawaban ini agak terlambat - memang benar pada saat pertanyaan diajukan, tetapi tidak benar lagi sejak penemuan paralelisme dinamis .
tera
16

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.

sandeep.ganage
sumber
13

__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.

nyata
sumber
7

Saya merekam beberapa spekulasi yang tidak berdasar di sini untuk saat ini (saya akan memperkuatnya nanti ketika saya menemukan beberapa sumber otoritatif) ...

  1. __device__fungsi dapat memiliki tipe kembalian selain void tetapi __global__fungsi harus selalu mengembalikan void.

  2. __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.

Otodidak
sumber
7

__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.

Lorin Ahmed
sumber
7

__global__ adalah kata kunci CUDA C (penentu deklarasi) yang mengatakan bahwa fungsinya,

  1. Jalankan di perangkat (GPU)
  2. Panggilan dari kode host (CPU).

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__.

Thilina Piyadasun
sumber
2

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

harishbisht29
sumber