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

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

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

Ответ 1

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

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

Ответ 2

Отличия между функциями __device__ и __global__:

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

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

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

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

Ответ 3

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

*) Функции __global__ можно вызывать из других функций __global__, начиная с
 вычислительные возможности 3.5.

Ответ 4

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

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
}

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

__global__ - это ключевое слово CUDA C (спецификатор объявления), которое говорит, что функция

  1. Выполняется на устройстве (GPU)
  2. Звонки с кода хоста (ЦП).

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

Однако функции __device__ не могут быть вызваны из кода хоста. Если вам нужно сделать это, используйте обе функции __host__ __device__.

Ответ 8

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

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

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

Ответ 9

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