在CUDA函數類型限定符__device__
和__host__
中可以一起使用,在這種情況下,爲主機和設備編譯函數。這可以消除複製粘貼。但是,不存在__host__ __device__
變量。我正在尋找一個優雅的方式做這樣的事情:CUDA __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
轉換銅文件到這一點:
...
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上重現。