Three things must agree, or nothing runs
'Install CUDA' is a misleading instruction — there isn't one thing called CUDA. There are three layers, each on a different release cadence, and they have to be compatible:
- Driver — kernel-mode software that talks to the GPU silicon. Shipped by NVIDIA, updated almost weekly. The driver advertises a maximum supported CUDA runtime version.
- Toolkit — userland headers, libraries (cuBLAS, cuDNN, cuFFT, etc.), and tools (NVCC, Nsight). Released every few months as 'CUDA 13.0', 'CUDA 13.2', etc.
- NVCC — the compiler binary inside the toolkit. It compiles your
.cusource into a fat binary containing PTX + multiple SASS variants targeted at specific compute capabilities (sm_75Turing,sm_86Ampere,sm_89Ada Lovelace,sm_90Hopper).
The compatibility rule: your driver must be ≥ the version baked into the toolkit you compiled with. A binary compiled with CUDA 13.2 toolkit will not run on a driver that only supports up to CUDA 12.4. The driver is the floor.
This sounds bureaucratic until something breaks. Then you'll be reading nvidia-smi output trying to figure out whether your driver, your toolkit, or your binary's SASS targets are the problem. The mental model is: install matching versions, and bake the right SASS into the binary.
Why does this matter for AI work? Because PyTorch, TensorFlow, JAX, and MLX all ship pre-compiled CUDA kernels for specific compute capabilities. When you upgrade your GPU from a 30-series to a 40-series, you may need a newer framework wheel that contains sm_89 SASS — otherwise everything still works through PTX JIT, just slower at startup.