cuda - nvcc 警告设备变量是主机变量 - 为什么?

标签 cuda compiler-warnings nvcc compiler-bug template-variables

我一直在阅读《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/

相关文章:

c++11 - 无法摆脱 "warning: command line option ‘-std=c++11’“使用 nvcc/CUDA/cmake

cuda - 当大小不是 2 的幂时向量和的减少?

c++ - CUDA 默认流和 CUDA_API_PER_THREAD_DEFAULT_STREAM

无法在我自己的代码中使用 CHOLMOD 和 CUDA 加速

exception-handling - cuda 异常后的内存数据状态

C 警告 : implicit declaration of function 'flock' only applies to one of two flock() calls

c++ - 模板案例的编译器警告,模板特化应涵盖

c - CUDA 和 C 的 Makefile

c++ - 返回对局部变量的引用

c++ - CUDA 错误 : name followed by "::" must be a class or namespace