__constant__ const unsigned int *ff = (const unsigned int[]){90, 50, 100};
int main()
{
}
编译:
nvcc ./test.cu
./test.cu(1): error: identifier "__T20" is undefined in device code
1 error detected in the compilation of "/tmp/tmpxft_0000785f_00000000-10_test.cpp2.i".
详细编译:
nvcc --verbose ./test.cu
#$ _SPACE_=
#$ _CUDART_=cudart
#$ _HERE_=/usr/lib/nvidia-cuda-toolkit/bin
#$ _THERE_=/usr/lib/nvidia-cuda-toolkit/bin
#$ _TARGET_SIZE_=
#$ _TARGET_DIR_=
#$ _TARGET_SIZE_=64
#$ NVVMIR_LIBRARY_DIR=/usr/lib/nvidia-cuda-toolkit/libdevice
#$ PATH=/usr/lib/nvidia-cuda-toolkit/bin:/home/kasha/bin:/home/kasha/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
#$ LIBRARIES= -L/usr/lib/x86_64-linux-gnu/stubs
#$ gcc -D__CUDA_ARCH__=200 -E -x c++ -DCUDA_DOUBLE_MATH_FUNCTIONS -D__CUDACC__ -D__NVCC__ -D"__CUDACC_VER__=70517" -D"__CUDACC_VER_BUILD__=17" -D"__CUDACC_VER_MINOR__=5" -D"__CUDACC_VER_MAJOR__=7" -include "cuda_runtime.h" -m64 "./test.cu" > "/tmp/tmpxft_0000799b_00000000-9_test.cpp1.ii"
#$ cudafe --allow_managed --m64 --gnu_version=50400 -tused --no_remove_unneeded_entities --gen_c_file_name "/tmp/tmpxft_0000799b_00000000-4_test.cudafe1.c" --stub_file_name "/tmp/tmpxft_0000799b_00000000-4_test.cudafe1.stub.c" --gen_device_file_name "/tmp/tmpxft_0000799b_00000000-4_test.cudafe1.gpu" --nv_arch "compute_20" --gen_module_id_file --module_id_file_name "/tmp/tmpxft_0000799b_00000000-3_test.module_id" --include_file_name "tmpxft_0000799b_00000000-2_test.fatbin.c" "/tmp/tmpxft_0000799b_00000000-9_test.cpp1.ii"
#$ gcc -D__CUDA_ARCH__=200 -E -x c -DCUDA_DOUBLE_MATH_FUNCTIONS -D__CUDACC__ -D__NVCC__ -D__CUDANVVM__ -D__CUDA_PREC_DIV -D__CUDA_PREC_SQRT -m64 "/tmp/tmpxft_0000799b_00000000-4_test.cudafe1.gpu" > "/tmp/tmpxft_0000799b_00000000-10_test.cpp2.i"
#$ cudafe -w --allow_managed --m64 --gnu_version=50400 --c --gen_c_file_name "/tmp/tmpxft_0000799b_00000000-11_test.cudafe2.c" --stub_file_name "/tmp/tmpxft_0000799b_00000000-11_test.cudafe2.stub.c" --gen_device_file_name "/tmp/tmpxft_0000799b_00000000-11_test.cudafe2.gpu" --nv_arch "compute_20" --module_id_file_name "/tmp/tmpxft_0000799b_00000000-3_test.module_id" --include_file_name "tmpxft_0000799b_00000000-2_test.fatbin.c" "/tmp/tmpxft_0000799b_00000000-10_test.cpp2.i"
./test.cu(1): error: identifier "__T20" is undefined in device code
1 error detected in the compilation of "/tmp/tmpxft_0000799b_00000000-10_test.cpp2.i".
# --error 0x2 --
在编译期间,cuda将数组(const unsigned int []){90,50,100}转换为__T20
变量,并将其声明为静态。因此它无法访问主文件。在主文件中有:__constant__ const unsigned *ff = __T20;
如何使用cuda中的数组初始化全局指针?
答案 0 :(得分:1)
编译器正在告诉您错误是什么。当你这样做时:
__constant__ const unsigned int *ff = (const unsigned int[]){90, 50, 100};
您正尝试将匿名主机阵列的地址静态分配给设备符号。显然这毫无意义;即使它会编译,分配给ff
的地址也将无效,因为它将在主机内存中。
据我所知,在初始化静态声明的全局设备符号时,无法在设备内存中声明和使用匿名对象。
您可以这样做:
__device__ const unsigned int ee[3] = {90, 50, 100};
__constant__ const unsigned int *ff = &ee[0];
int main()
{
}
以便使用编译器明确可以识别为在设备内存中的地址进行静态分配。请注意,常量内存的预期缓存属性仅适用于指针值,而不适用于它指向的内存,因此我想到的用于您尝试执行的操作的用例非常有限。