Подтвердить что ты не робот

Параметр ядра, проходящий в 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

4b9b3361

Ответ 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? Это то же самое, что идея создания униформы в шейдере.