Getting OpenCV to work with CUDA, "no kernel image is available..."

I have a Jetson Orin Nano, and I’d like to get OpenCV to use CUDA. I understand that this isn’t built in, so I followed instructions that I found at https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html to install OpenCV 4.6. Since those instructions are for an older Jetson Nano, I modified the script to select the correct GPU:

CUDA_ARCH_BIN=8.0

This is specifically what I have found in forums for dealing with the error I’m getting, but it isn’t helping. Despite getting the version right, as far as I can tell, I still get this error when I try to do anything CUDA-related:

error: (-217:Gpu API call) no kernel image is available for execution on the device in function 'call' Aborted

Is 8.0 the right architecture/GPU? Are there tools I can install to diagnose this? What else can I do to figure out what’s going wrong here?

Thanks.

Hi @theosib, try CUDA_ARCH_BIN=8.7 for Orin instead. If you check the CUDA deviceQuery output, it is listed there:

/usr/local/cuda/samples/1_Utilities/deviceQuery$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Orin"
  CUDA Driver Version / Runtime Version          11.4 / 11.4
  CUDA Capability Major/Minor version number:    8.7
  Total amount of global memory:                 6434 MBytes (6746046464 bytes)
  (008) Multiprocessors, (128) CUDA Cores/MP:    1024 CUDA Cores
  GPU Max Clock rate:                            624 MHz (0.62 GHz)
  Memory Clock rate:                             624 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 2097152 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total shared memory per multiprocessor:        167936 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1536
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Managed Memory:                Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.4, NumDevs = 1
Result = PASS
1 Like

Thanks! I didn’t know about that. I guess I should spend some time looking through those samples. I’ve changed the version to 8.7 and will report back how it goes. Thanks!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.