我一直在阅读《CUDA 编程指南》中有关模板函数的内容,这样的东西是否有效?
#include <cstdio>
/* host struct */
template <typename T>
struct Test {
T *val;
int size;
};
/* struct device */
template <typename T>
__device__ Test<T> *d_test;
/* test function */
template <typename T>
T __device__ testfunc() {
return *d_test<T>->val;
}
/* test kernel */
__global__ void kernel() {
printf("funcout = %g \n", testfunc<float>());
}
我得到了正确的结果,但有警告:
“警告:主机变量“d_test [with T=T]”无法在设备函数中直接读取”?
测试函数中的结构体要使用 *d_test<float>->val
进行实例化?
韩国, 伊吉
最佳答案
不幸的是,CUDA 编译器似乎通常在变量模板方面存在一些问题。如果你look at the assembly ,您会发现一切正常。编译器显然会实例化变量模板并分配相应的设备对象。
.global .align 8 .u64 _Z6d_testIfE;
生成的代码按照预期使用该对象
ld.global.u64 %rd3, [_Z6d_testIfE];
我认为这个警告是一个编译器错误。请注意,我无法在此处重现 CUDA 10 的问题,因此该问题现在很可能已得到解决。考虑更新你的编译器......
关于cuda - nvcc 警告设备变量是主机变量 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403859/