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

OpenCV cuda_info.cpp — CUDA 13 対応パッチ差分まとめ

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 など)が直接参照できなくなったため。
  • 公式が推奨する 属性 APIcudaDeviceGetAttribute)に置換するのが互換性のある正攻法。

6. 影響範囲

  • 対象ファイル:modules/core/src/cuda_info.cpp のみ。
  • CUDA 13 未満では従来コードを使用するため、下位互換性を維持。

7. ビルド・動作確認の要点

  1. CUDA 13.x(ツールキット)と対応 cuDNN を導入済みであること。
  2. LD_LIBRARY_PATH=/usr/local/cuda-13.0/lib64 を明示する(サービス/IDE 実行時も)。
  3. OpenCV を再ビルドし、cv2.getBuildInformation() で CUDA が有効か確認。
  4. DNN(CUDA) の最小実行(ランダム入力で net.forward())が通るかを確認。

以上。まだビルド途中なので、追記するかも。
追記:VideoStabはOFFに それでビルド 正常動作を確認!
 ©株式会社ビー・ナレッジ・デザイン

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA