Передача параметров ядра в CUDA? - PullRequest
16 голосов
/ 28 июня 2011

У меня есть сомнения новичка относительно того, как работают ядра 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's greeting
    cudaPrintfDisplay();

    // clean up after cuPrintf
    cudaPrintfEnd();
}

Результат выполнения:

Param value: 456
Param value: 456
Param value: 456
Param value: 456

Я не могу понять, как ядро ​​может прочитать правильное значение параметра, который я передаю, разве он не размещен в памяти хоста?Может ли графический процессор читать из памяти хоста?

Спасибо,

Андреа

Ответы [ 5 ]

16 голосов
/ 21 января 2014

Согласно разделу Е.2.5.2.Параметры функции в CUDA C Руководство по программированию

__ global__ функциональные параметры передаются на устройство:

  • через разделяемую память и ограничены 256 байтами на устройствах вычисленийвозможность 1.x,
  • через постоянную память и ограничена 4 КБ на устройствах с вычислительной возможностью 2.x и выше.
13 голосов
/ 28 июня 2011

Объявление void testKernel(int param) говорит, что param передается по значению, а не по ссылке.Другими словами, стек содержит копию значения a, а не указатель на a.CUDA копирует стек в ядро, работающее на GPU.

3 голосов
/ 28 июня 2011

Согласно Руководству по программированию CUDA (Приложение B.16) аргументы передаются на устройство через общую память.

Аргументы к исполнению Конфигурация оценивается до фактические аргументы функции и как аргументы функции , в настоящее время передается через общую память устройство.

0 голосов
/ 26 февраля 2018

В API времени выполнения параметры для global функций неявно распределяются и копируются с хоста на устройство.

Компилятор NVCC генерирует код, который скрывает от вас сортировку. Размеры и ограничения параметров можно найти в Руководстве по программированию CUDA

0 голосов
/ 28 июня 2011

Параметры передаются ядрам при их вызове;в противном случае, как еще вы будете общаться с GPU?Это то же самое, что идея установки униформы в шейдере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...