2

我正在尝试将 CUDA 和 openCV 集成到一个项目中。问题是使用 NVCC 时 openCV 无法编译,而普通的 c++ 项目编译得很好。这对我来说似乎很奇怪,因为我认为 NVCC 将所有主机代码都传递给了 c/c++ 编译器,在本例中是 Visual Studio 编译器。

我得到的错误是?

c:\opencv2.0\include\opencv\cxoperations.hpp(1137): error: no operator "=" 匹配这些操作数操作数类型是: const cv::Range = cv::Range

c:\opencv2.0\include\opencv\cxoperations.hpp(2469):错误:多个重载函数“std::abs”实例与参数列表匹配:函数“abs(long double)”函数“abs( float)" 函数 "abs(double)" 函数 "abs(long)" 函数 "abs(int)" 参数类型为: (ptrdiff_t)

所以我的问题是为什么使用相同编译器(应该)的差异,其次是我如何解决这个问题。

4

5 回答 5

2

一般来说,我建议将主机代码和 CUDA 代码分开,仅将 nvcc 用于内核和主机“包装器”。这在 Visual Studio 中特别容易,像平常一样创建您的项目(例如控制台应用程序),然后在 .cpp 文件中实现您的应用程序。当您要运行 CUDA 函数时,请在一个或多个 .cu 文件中创建内核和包装器。SDK 提供的 Cuda.rules 文件将自动启用 VS 编译 .cu 文件并将结果与​​其余 .cpp 文件链接。

于 2009-12-05T15:41:10.833 回答
1

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

这是一个非常简单的项目,演示了如何将常规 C++ 代码(OpenCV 和其他东西)从 CUDA 代码中分离出来并编译它们。

于 2011-10-18T15:46:08.337 回答
1

将 .cu 代码编译为库,然后将其链接到主程序。我建议使用 cmake,因为它使过程变得轻而易举

于 2009-12-11T10:43:19.740 回答
1

NVCC 将 C++ 代码传递给主机编译器,但它必须首先解析和理解代码。不幸的是,NVCC 在 STL 方面遇到了麻烦。如果可能的话,将使用 STL 的代码分离到 .cpp 文件中,并使用 Visual Studio 编译这些代码(无需先通过 NVCC 传递它们)。

于 2009-12-07T10:25:43.140 回答
0

所以没有简单的方法可以使用 nvcc 来编译你当前的 C++ 代码,你必须编写包装器并使用 nvcc 编译它们,而你使用 g++ 或你有什么来编译其余代码?

于 2010-04-19T04:42:09.650 回答