使用 CUDA 12 构建 OpenCV,未定义标识符 cudaUnbindTexture、textureReference

Tho*_*son 2 opencv cuda cmake

我尝试用cuda编译Opencv,但出现错误

运行:

  • nvidia-驱动程序-525.60.13
  • CUDA 12.0
  • OpenCV 3.4.16

我不知道它从哪里来...

[  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)

有人遇到过这个问题吗?

Rob*_*lla 7

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 工具包,该工具包仍然具有对纹理引用使用的已弃用支持。