Может ли кто-нибудь описать различия между __global__
и __device__
?
Когда следует использовать __device__
и когда использовать __global__
?.
Может ли кто-нибудь описать различия между __global__
и __device__
?
Когда следует использовать __device__
и когда использовать __global__
?.
Глобальные функции также называются "ядрами". Это функции, которые вы можете вызывать со стороны хоста с помощью семантики вызова ядра CUDA (<<<...>>>
).
Функции устройства можно вызывать только из других устройств или глобальных функций. Функции __device__
нельзя вызывать из кода хоста.
Отличия между функциями __device__
и __global__
:
__device__
функции можно вызывать только с устройства, и он выполняется только в устройстве.
__global__
функции могут быть вызваны с хоста, и они выполняются в устройстве.
Следовательно, вы вызываете функции __device__
из функций ядер, и вам не нужно устанавливать параметры ядра. Вы также можете "перегрузить" функцию, например: вы можете объявить void foo(void)
и __device__ foo (void)
, затем один из них выполняется на хосте и может быть вызван только из хост-функции. Другой выполняется на устройстве и может быть вызван только из устройства или функции ядра.
Вы также можете посетить следующую ссылку: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, это было полезно для меня.
__global__
- Запускается на графическом процессоре, вызываемом из центрального процессора или графического процессора *. Выполнено с аргументами <<<dim3>>>
.__device__
- запускается на графическом процессоре, вызванном из графического процессора. Можно использовать и с переменными.__host__
- запускается на процессоре, который вызывается из процессора.*) Функции __global__
можно вызывать из других функций __global__
, начиная с
вычислительные возможности 3.5.
Я объясню это с помощью примера:
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"
Этого должно быть достаточно, чтобы понять разницу.
__global__
- для ядер cuda, функций, вызываемых непосредственно из хоста. __device__
функции могут быть вызваны из функций __global__
и __device__
, но не из хоста.
В настоящее время я фиксирую некоторые необоснованные предположения (я буду обосновывать их позже, когда сталкиваюсь с каким-то авторитетным источником)...
__device__
функции могут иметь тип возврата, отличный от void, но __global__
функции всегда должны возвращать void.
__global__
функции могут быть вызваны из других ядер, запущенных на GPU, для запуска дополнительных потоков GPU (как часть динамической модели CUDA parallelism (aka CNP)), а функции __device__
работают на одном и том же thread как вызывающее ядро.
__global__
- это ключевое слово CUDA C (спецификатор объявления), которое говорит, что функция
глобальные функции (ядра), запускаемые кодом хоста с использованием <<< no_of_blocks , no_of threads_per_block>>>
.
Каждый поток выполняет ядро по своему уникальному идентификатору потока.
Однако функции __device__
не могут быть вызваны из кода хоста. Если вам нужно сделать это, используйте обе функции __host__
__device__
.
__global__
Функция - это определение ядра. Всякий раз, когда он вызывается из CPU, это ядро запускается на графическом процессоре.
Однако каждый поток, выполняющий это ядро, может потребовать повторного выполнения некоторого кода, например, для замены двух целых чисел. Таким образом, здесь мы можем написать вспомогательную функцию, как и в C-программе. А для потоков, выполняемых на GPU, вспомогательная функция должна быть объявлена как __device__
.
Таким образом, функция устройства вызывается из потоков ядра - один экземпляр для одного потока. Хотя глобальная функция вызывается из потока ЦП.
Глобальная функция может быть вызвана только с хоста, и у них нет типа возврата, в то время как функция устройства может быть вызвана только из функции ядра другой функции устройства, поэтому не требуется установка ядра