はじめに
- 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
- 一方で、自分のマシンでビルドして、自分のマシンでだけOpenCVを利用する場合、不要な
- Arm環境では、使えるGPUが限られているため、自動検出を行い、それでも見つからなかった場合は決め打ちでいくつかの
CC
分のビルドを生成する
- また、古いCUDAのサポートに関しては、明示的に
cmake/OpenCVMinDepVersions.cmake
(リンク)に記載されており、現状の3.4系、4系ではCUDA 6.5が古い後方互換性の限度である2
おわりに
- OpenCVをビルドする際のサポートされているCUDAの範囲をまとめました。
- 明日は23日目で発起人の@dandelion1124 先生の記事です!