web-dev-qa-db-ja.com

CUDAサポートを使用してOpenCVをビルドする

私はCMakeを使用して、Visual Studio 2013ソリューションを生成します。次に、それをビルドしようとしますが、フォローエラーが発生します:

NVCC(デバイス)オブジェクトの構築modules/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj

nvcc fatal:サポートされていないGPUアーキテクチャ 'compute_11'

バージョン2.10および3.0でcuda 6.5および7.0を試してみてください。 CUDA_Arch_BINに設定:1.1 1.2 1.3 2.0 2.1(2.0)3.0 3.5

20
Anatoly

別のオプション。 Ubuntu 14.04、GTX Titan X、opencv-2.4.10

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Auto -D BUILD_NEW_PYTHON_SUPPORT=ON  .. 

patch も適用しましたが、最終的に必要かどうかはわかりません。ありとなしCUDA_GENERATION=Maxwellしかし、Maxwellは検出されません。試していないCUDA_GENERATION=Autoパッチの前に、それは私が確かに知らない理由です。

21
user1269942

Cmakeを使用して構成を行う場合、オプションCUDA_GENERATIONを特定のGPUアーキテクチャに設定します。私は同じエラーに出くわし、これを試して問題を解決しました。

13
Yun Zhao

Yunの答えをフォローアップ(コメントを残すことはできませんでした)、これは私のために働き、CUDA_GENERATIONの可能な値を示しています:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

(Ubuntu 12.04および14.04、GTX Titan、およびOpenCV 2.4.11および3.0.0。)

10
Ulrich Stern

CUDA_GENERATIONを使用して、GPUアーキテクチャに対応する生成コード名を指定できます。

関連する opencv cmakeコード は、CUDA_GENERATION値を解析します。

  set(__cuda_Arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_Arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_Arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_Arch_bin "5.0 5.2")
  elseif(CUDA_GENERATION STREQUAL "Pascal")
    set(__cuda_Arch_bin "6.0 6.1")
  elseif(CUDA_GENERATION STREQUAL "Volta")
    set(__cuda_Arch_bin "7.0")
  elseif(CUDA_GENERATION STREQUAL "Auto")
    execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" ${CUDA_NVCC_FLAGS} "${OpenCV_SOURCE_DIR}/cmake/checks/OpenCVDetectCudaArch.cu" "--run"
                     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
                     RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out
                     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(NOT _nvcc_res EQUAL 0)
      message(STATUS "Automatic detection of CUDA generation failed. Going to build for all known architectures.")
    else()
      set(__cuda_Arch_bin "${_nvcc_out}")
      string(REPLACE "2.1" "2.1(2.0)" __cuda_Arch_bin "${__cuda_Arch_bin}")
    endif()
endif()

また、ウィキペディアのCUDAページには、ビデオカードを適切なマイクロアーキテクチャコード名にマッピングするための素敵なテーブルがあります(申し訳ありませんが、ここで再現するには大きすぎます)。

https://en.wikipedia.org/wiki/CUDA#GPUs_supported

たとえば、2012年中頃のMacbook ProにはアンティークのGeForce GT 650Mがあります。これは、ウィキペディアの表で、Keplerマイクロアーキテクチャを使用していることが示されています。したがって、私はこれをcmakeコマンドラインで使用します。

cmake -D CUDA_GENERATION="Kepler" ...

また、opencvスクリプトは、構成サマリーを表示するときに「3.0 3.5 3.7」に変換し、対応するフラグをnvccに渡します。

私の場合、これを適切に設定する前に、compute_70がサポートされていないというエラーが表示されていました。どうやら、自動検出が正常に動作しないという今日(2017-10-07)現在、まだ opencvトラッカーの未解決の問題 があります。

6
rob3c

ありがとうございました、

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

これにより、opencv-2.4.9をインストールできます。

詳細を知りたい場合は、この link をチェックしてください。

4
itp

これは、GPUタイプが一致しないためです。

CUDA_GENERATIONを明示的に定義する必要があります。

私の側では、3種類のCUDA_GENERATIONを見つけることができました。オート、ケプラー、フェルミ。

CUDA_GENERATIONをKeplerに設定すると、compute_11がcompute_30に変わり、ビルドが成功しました。

3
PhonPanom

cmakeでこれらのエントリを設定する必要がありますCUDA_Arch_BIN = 3.2およびCUDA_Arch_PTX = 3.2

それが役に立てば幸い。

よろしく

2
Francisco

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Kepler -D BUILD_NEW_PYTHON_SUPPORT=ON ..

openCV 2.4.11で働いていました

1
WillC