我尝试用cuda编译Opencv,但出现错误
运行:
我不知道它从哪里来...
[ 7%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc.o
/home/totar/cv2/opencv-3.4.16/modules/cudev/include/opencv2/cudev/ptr2d/texture.hpp(61): error: texture is not a template
/home/totar/cv2/opencv-3.4.16/modules/cudev/include/opencv2/cudev/ptr2d/texture.hpp(83): error: identifier "cudaUnbindTexture" is undefined
/home/totar/cv2/opencv-3.4.16/modules/core/include/opencv2/core/cuda/common.hpp(99): error: identifier "textureReference" is undefined
3 errors detected in the compilation of "/home/totar/cv2/opencv-3.4.16/modules/core/src/cuda/gpu_mat.cu".
CMake Error at cuda_compile_1_generated_gpu_mat.cu.o.Release.cmake:279 (message):
Error generating file
/home/totar/cv2/opencv-3.4.16/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o
modules/core/CMakeFiles/opencv_core.dir/build.make:63: recipe for target 'modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o' failed
make[2]: *** [modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o] Error 1
CMakeFiles/Makefile2:1889: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
Run Code Online (Sandbox Code Playgroud)
nvcc --version 的输出
totar@totar:~/cv2/opencv-3.4.16/build$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Mon_Oct_24_19:12:58_PDT_2022
Cuda compilation tools, release 12.0, V12.0.76
Build cuda_12.0.r12.0/compiler.31968024_0
Run Code Online (Sandbox Code Playgroud)
有人遇到过这个问题吗?
CUDA 12.0放弃了对旧纹理引用的支持。因此,任何使用旧版纹理引用的代码都无法再使用 CUDA 12.0 或更高版本正确编译。
旧版纹理参考用法已被弃用一段时间了。
如评论中所示,通过恢复到仍支持旧纹理引用(尽管已弃用)的 CUDA 11.x,您将不会遇到此问题。
当 OpenCV 将旧纹理引用的使用转换为纹理对象方法时,有一天可能会出现另一种选择。在这种情况下,可以使用 CUDA 12.0 或更新的 CUDA 工具包来编译 OpenCV/CUDA 功能。
没有解决方法可以以某种方式允许使用 CUDA 12.0 及更高版本正确编译纹理参考使用。
同样,这个限制并不是 OpenCV 独有的或特定的。任何使用纹理引用的 CUDA 代码都无法再使用 CUDA 12.0 及更高版本正确编译。这些选项是使用纹理对象使用来重构该代码,或者恢复到以前的 CUDA 工具包,该工具包仍然具有对纹理引用使用的已弃用支持。