【发布时间】:2016-01-18 01:01:10
【问题描述】:
在 CUDA 函数类型限定符 __device__ 和 __host__ 可以一起使用,在这种情况下,该函数是为主机和设备编译的。这允许消除复制粘贴。但是,没有 __host__ __device__ 变量这样的东西。我正在寻找一种优雅的方式来做这样的事情:
__host__ __device__ const double common = 1.0;
__host__ __device__ void foo() {
... access common
}
__host__ __device__ void bar() {
... access common
}
我发现以下代码符合并运行时没有错误。 (所有结果都是在 Ubuntu 14.04 上使用 CUDA 7.5 和 gcc 4.8.4 作为主机编译器获得的)
#include <iostream>
__device__ const double off = 1.0;
__host__ __device__ double sum(int a, int b) {
return a + b + off;
}
int main() {
double res = sum(1, 2);
std::cout << res << std::endl;
cudaDeviceReset();
return 0;
}
$ nvcc main.cu -o main && ./main
4
事实上,nvcc --cuda main.cu 将 cu-file 翻译成这样:
...
static const double off = (1.0);
# 5 "main.cu"
double sum(int a, int b) {
# 6 "main.cu"
return (a + b) + off;
# 7 "main.cu"
}
# 9 "main.cu"
int main() {
# 10 "main.cu"
double res = sum(1, 2);
# 11 "main.cu"
(((std::cout << res)) << (std::endl));
# 12 "main.cu"
cudaDeviceReset();
# 13 "main.cu"
return 0;
# 14 "main.cu"
}
...
但是,毫不奇怪,如果声明变量 off 时没有 const 限定符 (__device__ double off = 1.0),我会得到以下输出:
$ nvcc main.cu -o main && ./main
main.cu(7): warning: a __device__ variable "off" cannot be directly read in a host function
3
那么,回到最初的问题,我可以依靠全局__device__ const 变量的这种行为吗?如果没有,还有哪些其他选择?
UPD顺便说一句,上述行为不会在 Windows 上重现。
【问题讨论】: