Разница между глобальными и функциями устройства


65

Может ли кто-нибудь описать различия между __global__ и __device__?

Когда следует использовать __device__, и когда использовать __global__?.

93

Глобальные функции также называются «ядрами». Это функции, которые вы можете вызывать со стороны хоста, используя семантику вызова ядра CUDA (<<<...>>>).

Функции устройства могут быть вызваны только с других устройств или глобальных функций. __device__ нельзя вызывать из главного кода.

+7

Подобно тому, как добавление, '__global__' функция также может быть вызвана из устройства с использованием семантики ядра CUDA (<<<...> >>), если вы используете динамический параллелизм - что требует CUDA 5.0 и возможности вычислений 3.5 или выше. 11 сен. 122012-09-11 17:44:18


10

__global__ предназначен для ядер cuda, функций, вызываемых непосредственно из хоста. __device__ функции могут быть вызваны от __global__ и __device__ функций, но не от хоста.


28

Различия между __device__ и __global__ функциями являются:

__device__ функция может быть вызвана только из устройства, и оно выполняется только в устройстве.

__global__ Функции могут быть вызваны с хоста и выполнены в устройстве.

Следовательно, вы вызываете __device__ функции из функций ядра, и вам не нужно устанавливать параметры ядра. Вы также можете «перегрузить» функцию, например: вы можете объявить void foo(void) и __device__ foo (void), затем один из них выполняется на хосте и может быть вызван только из хост-функции. Другой выполняется на устройстве и может быть вызван только из устройства или функции ядра.

Вы также можете посетить следующую ссылку: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, это было полезно для меня.


12

Я объясню это на примере:

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 
} 

т.е. когда мы хотим, чтобы функция (ЦП) для вызова функции устройства (GPU), затем «глобального» используется. Прочитайте это: «https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions»

И когда мы хотим функцию устройства (GPU) (вместо ядра), чтобы вызвать другую функцию ядра мы используем «устройство». Прочтите это «https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions»

Этого должно быть достаточно, чтобы понять разницу.


5

__global__ Функция - это определение ядра. Всякий раз, когда он вызывается из CPU, это ядро ​​запускается на графическом процессоре.

Однако каждый поток, выполняющий это ядро, может потребовать повторного выполнения некоторого кода, например, для замены двух целых чисел. Таким образом, здесь мы можем написать вспомогательную функцию, как и в C-программе. А для потоков, выполняемых на GPU, вспомогательная функция должна быть объявлена ​​как __device__.

Таким образом, функция устройства вызывается из потоков ядра - один экземпляр для одного потока. Хотя глобальная функция вызывается из потока ЦП.


6

Я записываю некоторые необоснованные домыслы здесь на некоторое время (я обосновал это позже, когда я сталкиваюсь с каким-то авторитетным источником) ...

  1. __device__ функция может иметь типа возвращаемого значения, кроме пустоты, но __global__ функции всегда должны возвращать пустоту.

  2. __global__ функции могут быть вызваны из других ядер, работающих на GPU для запуска дополнительных потоков GPU (в рамках динамической модели CUDA параллельности (ака CNP)) в то время как __device__ функции работают на том же потоке, что и ядро ​​вызова.


2

Глобальная функция может быть вызвана только с хоста, и они не имеют тип возвращаемого значения в то время как функция устройства может быть вызван только из функции ядра другой функции устройства, следовательно dosen't требует установки ядра


5

__golbal__ является CUDA C ключевое слово (объявление спецификатор), который говорит о том, что функция,

  1. Запускает на устройстве (GPU)
  2. вызовы от хоста (CPU) код.

глобальные функции (ядра), запускаемые с помощью хост-кода < < < no_of_blocks, no_of threads_per_block >>>. Каждый поток выполняет ядро ​​по его уникальному идентификатору потока.

Но __device__ функция не может быть вызвана из хоста code.if вам нужно сделать, это использовать как __host____device__


11
  1. __global__ - Запускается на GPU, называется от процессора. Выполнено с аргументами <<<dim3>>>.
  2. __device__ - Работает на графическом процессоре, вызывается с графического процессора. Может использоваться и с вариабелями.
  3. __host__ - Работает на процессоре, вызывается из CPU.
+1

Этот ответ немного запоздал - он был правильным в то время, когда вопрос был задан, но это уже не так, поскольку изобретение [динамического параллелизма] (https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamic параллелизм /). 12 сен. 162016-09-12 11:47:03