OpenCV4.12.0がCUDA13でビルドできないを解決したい。

OpenCV modules/core/src/cuda_info.cpp
— CUDA 13 対応変更点まとめ
目的:新調したPCが新しすぎて
CUDA 13 で cudaDeviceProp
の一部フィールドが廃止・非推奨になったため、OpenCV 4.12.0 の
cuda_info.cpp
がビルドエラーになる問題を解消し、実行時も安定させる。
1. 追加・変更したインクルードとヘルパ
#include <cuda_runtime.h>
を追加(既存の<cuda_runtime_api.h>
に加えて)。- CUDA 13 以上のみで有効になる属性取得ヘルパを導入(ガード付):
#if defined(HAVE_CUDA) && defined(CUDART_VERSION) && (CUDART_VERSION >= 13000)
#include <cuda_runtime.h>
static inline int cv_cuda_devAttr_int(int dev, cudaDeviceAttr attr) {
int v = 0; cudaDeviceGetAttribute(&v, attr, dev); return v;
}
#endif
2. 廃止フィールドの置換(関数ごと)
対象メンバ関数 | 旧(CUDA 12 以前) | 新(CUDA 13 以上) |
---|---|---|
int DeviceInfo::clockRate() const |
deviceProps()->clockRate |
cv_cuda_devAttr_int(device_id_, cudaDevAttrClockRate) |
bool DeviceInfo::kernelExecTimeoutEnabled() const |
deviceProps()->kernelExecTimeoutEnabled != 0 |
(cv_cuda_devAttr_int(device_id_, cudaDevAttrKernelExecTimeout) != 0) |
DeviceInfo::ComputeMode DeviceInfo::computeMode() const |
tbl[deviceProps()->computeMode] |
tbl[ cv_cuda_devAttr_int(device_id_, cudaDevAttrComputeMode) ] |
int DeviceInfo::maxTexture1DLinear() const |
deviceProps()->maxTexture1DLinear |
cv_cuda_devAttr_int(device_id_, cudaDevAttrMaxTexture1DLinearWidth) |
int DeviceInfo::memoryClockRate() const |
deviceProps()->memoryClockRate |
cv_cuda_devAttr_int(device_id_, cudaDevAttrMemoryClockRate) |
※ すべて #if defined(CUDART_VERSION) && (CUDART_VERSION >= 13000)
でガードし、
それ未満は従来コードをそのまま使用する条件コンパイルにしています。
3. 情報表示関数の修正
printCudaDeviceInfo(int device)
とprintShortCudaDeviceInfo(int device)
を、 文字列リテラルの改行崩れ(missing terminating " character)を直しつつ、 属性 API に合わせた安全な最小実装へ置換。- 代表値として以下を印字:デバイス名/メモリ/SM、GPUクロック、ランタイムタイムアウト、Compute Mode。
修正後のイメージ(抜粋)
printf("*** CUDA Device Query (Runtime API) ***\n");
printf("Device %d: \"%s\" %ldMb, sm_%d%d\n", device, prop.name,
(long)(prop.totalGlobalMem >> 20), prop.major, prop.minor);
printf(" GPU Clock Speed: %.2f GHz\n",
(cv_cuda_devAttr_int(device, cudaDevAttrClockRate) * 1e-6f));
printf(" Run time limit on kernels: %s\n",
(cv_cuda_devAttr_int(device, cudaDevAttrKernelExecTimeout) ? "Yes" : "No"));
printf(" Compute Mode: %d\n",
cv_cuda_devAttr_int(device, cudaDevAttrComputeMode));
4. 文字列リテラル崩れの修復
元ファイルに混入していた printf
の改行・引用符崩れを全面修正。すべて
"...\n"
の形式に統一し、エスケープの抜けでビルドが止まらないようにしました。
5. 追加・変更の狙い(理由)
- CUDA 13 で
cudaDeviceProp
の一部フィールド(例:clockRate
,kernelExecTimeoutEnabled
,computeMode
,maxTexture1DLinear
,memoryClockRate
など)が直接参照できなくなったため。 - 公式が推奨する 属性 API(
cudaDeviceGetAttribute
)に置換するのが互換性のある正攻法。
6. 影響範囲
- 対象ファイル:
modules/core/src/cuda_info.cpp
のみ。 - CUDA 13 未満では従来コードを使用するため、下位互換性を維持。
7. ビルド・動作確認の要点
- CUDA 13.x(ツールキット)と対応 cuDNN を導入済みであること。
LD_LIBRARY_PATH=/usr/local/cuda-13.0/lib64
を明示する(サービス/IDE 実行時も)。- OpenCV を再ビルドし、
cv2.getBuildInformation()
で CUDA が有効か確認。 - DNN(CUDA) の最小実行(ランダム入力で
net.forward()
)が通るかを確認。
以上。まだビルド途中なので、追記するかも。
追記:VideoStabはOFFに それでビルド 正常動作を確認!
©株式会社ビー・ナレッジ・デザイン