2

プロジェクトに CUDA と openCV を統合しようとしています。問題は、NVCC を使用すると openCV がコンパイルされないことですが、通常の C++ プロジェクトは正常にコンパイルされます。NVCC はすべてのホスト コードを c/c++ コンパイラ (この場合は Visual Studio コンパイラ) に渡すと思っていたので、これは奇妙に思えます。

私が得るエラーは何ですか?

c:\opencv2.0\include\opencv\cxoperations.hpp(1137): エラー: これらのオペランドに一致する演算子 "=" はありません オペランドの種類: 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

一般に、カーネルとホストの「ラッパー」には nvcc のみを使用して、ホスト コードと CUDA コードを分離することをお勧めします。これは Visual Studio では特に簡単です。プロジェクトを通常どおり作成し (コンソール アプリケーションなど)、アプリケーションを .cpp ファイルに実装します。CUDA 関数を実行する場合は、1 つ以上の .cu ファイルにカーネルとラッパーを作成します。SDK で提供される Cuda.rules ファイルは、VS が自動的に .cu ファイルをコンパイルし、結果を残りの .cpp ファイルとリンクできるようにします。

于 2009-12-05T15:41:10.833 に答える
1

NVCC は C++ コードをホスト コンパイラに渡しますが、最初にコードを解析して理解する必要があります。残念ながら、NVCC は STL に問題があります。可能であれば、STL を使用するコードを .cpp ファイルに分割し、それらを Visual Studio でコンパイルします (最初に NVCC を介さずに)。

于 2009-12-07T10:25:43.140 に答える
1

.cu コードをライブラリとしてコンパイルし、メイン プログラムにリンクします。プロセスが簡単になるので、cmakeを使用することをお勧めします

于 2009-12-11T10:43:19.740 に答える
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 に答える
0

したがって、現在の C++ コードをコンパイルするために nvcc を使用する簡単な方法はありません。g++ または what-have-you を使用して残りのコードをコンパイルしている間に、ラッパーを作成して nvcc を使用してコンパイルする必要があります。

于 2010-04-19T04:42:09.650 に答える