Параметр ядра, проходящий в CUDA?
У меня есть новичка сомнения относительно того, как работают ядра CUDA.
Если у вас есть следующий код (который использует функцию cuPrintf
, взятую из здесь):
#include "cuPrintf.cu"
__global__ void testKernel(int param){
cuPrintf("Param value: %d\n", param);
}
int main(void){
// initialize cuPrintf
cudaPrintfInit();
int a = 456;
testKernel<<<4,1>>>(a);
// display the device greeting
cudaPrintfDisplay();
// clean up after cuPrintf
cudaPrintfEnd();
}
Результат выполнения:
Param value: 456
Param value: 456
Param value: 456
Param value: 456
Я не могу понять, как ядро может прочитать правильное значение передаваемого параметра, не распределяется ли оно в памяти хоста? Может ли GPU считывать из памяти хоста?
Спасибо,
Andrea
Ответы
Ответ 1
В объявлении void testKernel(int param)
указано, что param
передается по значению, а не по ссылке. Другими словами, стек содержит копию значения a
, а не указателя на a
. CUDA копирует стек в ядро, запущенное на графическом процессоре.
Ответ 2
Согласно разделу E.2.5.2. Параметры функции в Руководство по программированию CUDA C
__ параметры функции global__ передаются на устройство:
- через общую память и ограничены 256 байтами на устройствах вычислительной возможности 1.x,
- через постоянную память и ограничены 4 КБ на устройствах с вычислительной способностью 2.x и выше.
Ответ 3
В соответствии с Руководством по программированию CUDA (Приложение B.16) аргументы передаются через разделяемую память на устройство.
Аргументы для выполнения конфигурации оцениваются до фактические аргументы функции и , как аргументы функции, в настоящее время передается через разделяемую память на устройство.
Ответ 4
Параметры передаются ядрам при их вызове; иначе как иначе вы могли бы общаться с GPU? Это то же самое, что идея создания униформы в шейдере.