search
LoginSignup
10
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

OpenCV Advent Calendar 2020 Day 22

posted at

updated at

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にならない。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
10
Help us understand the problem. What are the problem?