C++ 在CUDA中传递内核参数?
对于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上运行的
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
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