OpenCVをCUDA付きでビルドする際にサポートされる範囲


はじめに

  • NVIDIAの手島です
  • 本日はアドベントカレンダーが空いたので、OpenCVをCUDA付きでビルドする際のバージョンの組み合わせについて紹介します。
  • 本記事はOpenCV アドベントカレンダー 2020、第22日目の記事です。
  • 他の記事は目次を参照して下さい。

TL;DR

OpenCV CUDA CUDA(Minimum) CC(x86) CC(Arm) リリース日
next (5.0.0相当) 11.2 6.5 5.0 - 8.6 3.2,5.3,6.2,7.0,7.2 -
4.5.1 11.2 6.5 5.0 - 8.6 3.2,5.3,6.2,7.0,7.2 2020/Dec/22
3.4.13 11.2 6.5 5.0 - 8.6 3.2,5.3,6.2,7.0,7.2 2020/Dec/22
4.5.0 11.1 6.5 5.0 - 8.6 3.2,5.3,6.2,7.0,7.2 2020/Oct/12
3.4.12 11.1 6.5 5.0 - 8.6 3.2,5.3,6.2,7.0,7.2 2020/Oct/11
4.4.0 11.0 6.5 2.0 - 8.0 3.2,5.3,6.2,7.0,7.2 2020/Jul/18
4.3.0 10.2 6.5 2.0 - 7.5 3.2,5.3,6.2,7.2 2020/Apr/3
4.2.0 10.2 6.5 2.0 - 7.5 3.2,5.3,6.2,7.2 2019/Dec/20
4.1.0 10.1 6.5 2.0 - 7.5 3.2,5.3,6.2,7.2 2019/Apr/8
4.0.0 10.0 6.5 2.0 - 7.5 3.2,5.3,6.2,7.0,7.5 2018/Nov/18
3.4.0 9.0 6.5 2.0 - 7.0 3.2,5.3,6.2,7.0 7.5 2017/Dec/23
3.3.0 8.0 6.5 2.0 - 6.1 3.2,5.3,6.2 2017/Aug/4
3.2.0 8.0 6.5 2.0 - 6.1 3.2,5.3 2016/Dec/23
3.1.0 7.5 4.2 1.1 - 3.5 3.2,5.3 2015/Dec/19
3.0.0 7.0 4.2 1.1 - 3.5 3.2,5.3 2015/Jun/4
2.4.13.7 9.2 3.0 1.1 - 3.5 3.2,5.3 2018/Jul/2
  • 多分に推測を交えて書いているので、この早見表の正確性は保証しない
  • 2.4系列は古いので、最後のリリース以外は割愛
  • 今日、3.4.13と4.5.1がリリースされた

OpenCVとCUDAを連携してビルドする際の注意点

  • CUDAは後方互換性を破壊したバージョンアップをしばしばする
    • 古くはCUDA graphcutsが除外されたり、NVCUVIDが別パッケージに移動したり、nppiライブラリが細かく分割されたり、nppicomが除外されたりしました。
  • 基本的に後方互換性が維持されなかった場合、OpenCV側でfixが入るのを待つ必要がある
  • なので、新しいCUDAを使いたかったら新しいOpenCVを使う必要がある
  • 古いCUDAと新しいOpenCVの組み合わせは、基本的に動くことが期待される
    • ただし、使う人が少ないと地雷を踏む可能性があるので、特段理由が無い限り、CUDAもOpenCVも新しいものを使うことをお勧めします。
  • また、CUDAのバージョンとは別に、CC(Compute Capability)のサポート範囲もある
    • 要は新しいGPUに対応しているかどうか、という点を表す。
    • x86マシンでCCを明示的に指定しなかった場合、OpenCVでは基本的に全部乗せのライブラリを生成する。これにより、古いGPUのマシンにライブラリをコピーした際にも動くように、安全に設計されている。
      • 一方で、自分のマシンでビルドして、自分のマシンでだけOpenCVを利用する場合、不要なCC分のバイナリは単純にディスクの肥やしになるので、その場合は-DCUDA_ARCH_BINオプションを使ってCCを決め打ちすることをお勧めする。
      • また、CMake時点で、CC単位でなく、世代単位でまとめてビルドする方法もある。こちらは@dandelion1124 先生のissue提起私が投げたPRの結果、3.4.12から範囲が狭まった1
    • Arm環境では、使えるGPUが限られているため、自動検出を行い、それでも見つからなかった場合は決め打ちでいくつかのCC分のビルドを生成する
  • また、古いCUDAのサポートに関しては、明示的にcmake/OpenCVMinDepVersions.cmake (リンク)に記載されており、現状の3.4系、4系ではCUDA 6.5が古い後方互換性の限度である2

おわりに

  • OpenCVをビルドする際のサポートされているCUDAの範囲をまとめました。
  • 明日は23日目で発起人の@dandelion1124 先生の記事です!

  1. FermiとKepler世代がCMake時点での候補リストに現れなくなった。ただし、全部乗せでは依然ビルド対象となる。あとCUDA_ENABLE_DEPRECATED_GENERATIONオプションをONにすると候補リストに現れるようになる 

  2. ただし、正しく動くことを筆者が今日確認した訳ではない。あくまで、6.5より古いCUDAを使うと、CMake側でスルーされ、WITH_CUDAオプションがONにならない。