Почему OpenCV не компилируется в NVCC?

Я пытаюсь интегрировать CUDA и openCV в проект. Проблема заключается в том, что openCV не будет компилироваться, когда используется NVCC, в то время как обычный проект С++ компилируется просто отлично. Это кажется мне странным, так как я думал, что NVCC передал весь код хоста компилятору c/С++, в данном случае компилятору визуальной студии.

Я получаю ошибки?

c:\opencv2.0\include\opencv\cxoperations.hpp(1137): ошибка: оператор "=" не соответствует этим операндам           Типы операндов: const cv:: Range = cv:: Range

c:\opencv2.0\include\opencv\cxoperations.hpp(2469): ошибка: более одного экземпляра перегруженной функции "std:: abs" соответствует списку аргументов:           функция "abs (длинный двойной)"           функция "abs (float)"           функция "abs (******)"           функция "abs (long)"           функция "abs (int)"           Типы аргументов: (ptrdiff_t)

Итак, мой вопрос в том, почему используется различие, учитывая тот же самый компилятор (должен быть), и во-вторых, как я мог бы исправить это.

5 ответов

В общем, я бы рекомендовал сохранить разделение между кодом хоста и кодом CUDA, используя только nvcc для ядер и хост-пакетов. Это особенно удобно с Visual Studio, создайте проект как обычно (например, консольное приложение), а затем реализуйте приложение в файлах .cpp. Если вы хотите запустить функцию CUDA, создайте ядро ​​и обертку в одном или нескольких файлах .cu. Файл Cuda.rules, поставляемый с SDK, автоматически включит VS для компиляции файлов .cu и свяжет результат с остальными .cpp файлами.


NVCC передает код С++ в компилятор хоста, но он должен сначала разобрать и понять код. К сожалению, у NVCC возникли проблемы с STL. Если это вообще возможно, отдельный код, который использует STL в .cpp файлах и скомпилирован с Visual Studio (без передачи их сначала через NVCC).


Там размещен проект cuda-grayscale, в котором показано, как объединить OpenCV + CUDA вместе. Если вы загружаете источники, проверьте Makefile:

g++ $(CFLAGS) -c main.cpp -o Debug/main.o
nvcc $(CUDAFLAGS) -c kernel_gpu.cu -o Debug/kernel_gpu.o
g++ $(LDFLAGS) Debug/main.o Debug/kernel_gpu.o -o Debug/grayscale

Это очень простой проект, демонстрирующий, как отделить обычный код С++ (OpenCV и прочее) от кода CUDA и скомпилировать их.


Скомпилируйте код .cu как библиотеку, а затем привяжите ее к основной программе. Я предлагаю использовать cmake, поскольку он делает процесс ветерок


Таким образом, нет простого способа использовать nvcc для компиляции вашего текущего кода на С++, вы должны писать обертки и компилировать их с помощью nvcc, в то время как вы компилируете остальную часть своего кода с помощью g++ или what-have-you?

licensed under cc by-sa 3.0 with attribution.