Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在CUDA中传递内核参数?_C++_C_Memory_Cuda - Fatal编程技术网

C++ 在CUDA中传递内核参数?

C++ 在CUDA中传递内核参数?,c++,c,memory,cuda,C++,C,Memory,Cuda,对于CUDA内核如何工作,我有一个新手的疑问 如果具有以下代码(使用函数cuPrintf取自): 我无法获得内核如何读取我传递的参数的正确值,它不是分配在主机内存中吗?GPU能否从主机内存中读取数据 谢谢 Andrea当您调用内核时,参数被传递给内核;否则,您将如何与GPU通信?这与在着色器中设置统一的想法相同。声明void testKernel(int-param)表示param是通过值传递的,而不是通过引用。换句话说,堆栈包含a值的副本,而不是指向a的指针。CUDA将堆栈复制到GPU上运行的

对于CUDA内核如何工作,我有一个新手的疑问

如果具有以下代码(使用函数
cuPrintf
取自):

我无法获得内核如何读取我传递的参数的正确值,它不是分配在主机内存中吗?GPU能否从主机内存中读取数据

谢谢


Andrea

当您调用内核时,参数被传递给内核;否则,您将如何与GPU通信?这与在着色器中设置统一的想法相同。

声明
void testKernel(int-param)
表示
param
是通过值传递的,而不是通过引用。换句话说,堆栈包含
a
值的副本,而不是指向
a
的指针。CUDA将堆栈复制到GPU上运行的内核。

根据CUDA编程指南(附录B.16),参数通过共享内存传递到设备

执行的参数 在测试之前评估配置 实际函数参数和类似 函数参数,当前为 通过共享内存传递到 装置


根据第E.2.5.2节。中的函数参数

__全局函数参数传递给设备:

  • 通过共享内存,在计算能力为1.x的设备上限制为256字节
  • 通过恒定内存,在计算能力为2.x及更高的设备上限制为4KB

在运行时API中,全局函数的参数隐式编组并从主机复制到设备


NVCC编译器生成对您隐藏编组的代码。您可以在

中找到参数大小和限制,引号引用的是执行配置参数(4和1),而不是OP要求的函数参数(a==456)。@Steve您是对的,但它将它们与函数参数进行了比较,它说函数参数也是通过共享内存传递的。应该强调的是:)传递内核参数的方法因体系结构而异。计算能力1。*设备将值放入共享内存中。计算能力>=2.0将值放在常量内存中。这并不是真正的场景,因为您可以修改每个参数,比如说ar是一个int参数,因此-you my write:at=threadIdx.x;这不会使场景中的所有线程都只修改共享值。因此,如果我理解正确,在内核执行期间,
param
将被放入GPU内存堆栈中。因此,如果我多次阅读它,我将不会访问任何“主机内存”,从而降低性能,对吗?文档中并不清楚内核参数的存储位置。您可以假设它位于快速内存中:寄存器、共享或常量。正如kirbuchi在他的回答中所说,《CUDA编程指南》(3.0指南中的B.13节)说“执行配置的参数在实际函数参数之前进行评估,就像函数参数一样,当前通过共享内存传递给设备”。完美。再次感谢您的回答。函数变量由NVCC编译器隐式编组并复制到设备。
#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