GPU kernel engineering

Navigating CUDA 13 setup: GPU limits, timing traps, and profiler access

GPU kernel engineering is full of traps that waste hours, and the CUDA 13 setup session from this free video series collects the ones that cost most.

3 min readMachine Learning

The most useful thing you will read about CUDA 13 setup this month is a Reddit post that treats configuration traps as first-class engineering problems. The author of the free From naive GEMM to FlashAttention: a free code-first GPU kernel series series has collected the exact friction points that waste days, compute capability checks, asynchronous timing pitfalls, profiler permission errors, and packaged them into a single, actionable reference. This is the kind of documentation that should ship with every GPU development toolkit, yet it almost never does.

The core insight is that knowing you have an NVIDIA GPU is nearly useless. You need to know the compute capability, because CUDA 13 has dropped Maxwell, Pascal, and Volta entirely. A GTX 16-series card runs Turing architecture but has no tensor cores. FP8 work requires Ada or Hopper. These distinctions are not academic; they determine whether your code compiles, whether your profiler runs, and whether your benchmarks measure anything real. The author's smoke-test kernel, a tiny add-one operation checked with `nvcc -arch=native`, then verified with `nsys` and `ncu`, is the single most practical suggestion in the entire post. Run that first. If it works, your driver, toolkit, GPU, and profilers are all functional. If it fails, you save hours of debugging a broken pipeline.

The timing trap is another example of a problem that feels obvious in hindsight but catches everyone. GPU launches are asynchronous, so a naive Python timer around `x @ y` mostly measures the launch overhead, not the computation. The author provides a clean benchmarking function that warms up, synchronizes, uses CUDA events, and averages over iterations. The detail that really matters is the note on dtype: record whether you are measuring FP32 or BF16, because the baseline throughput differs so dramatically that an unlabeled number is meaningless. This is the difference between data and noise.

What makes this post resonate is how it connects to the broader challenges in the GPU ecosystem. The Amazon challenges Nvidia's AI grip with new tool for alternative chips story shows that competition is finally arriving for the hardware layer, but the software layer, the setup, the tooling, the profiler permissions, remains a fragmented mess. Even if you rent an H100, you must test whether the provider allows counter access for Nsight Compute, because managed containers often block it by default. The author's question about the biggest setup trap is the one to watch: Secure Boot, container toolkits, and mismatched host compilers are all waiting to consume your next afternoon. The answer, for now, is to treat setup as a first-class deliverable, not an afterthought.

From Machine Learning

I'm working through a free series on GPU kernel engineering (my own channel; I posted the roadmap here earlier: https://www.reddit.com/r/MachineLearning/comments/1xa4h2g/open_gpu_kernel_engineering_series_naive_gemm_to/ ) . Session 1 is a setup session. While preparing it I collected a few things that cost me time and that I rarely see in one place, so I'm sharing them here directly. The video and code are linked at the end.

nvidia-smi --query-gpu=name,compute_cap --format=csv

Read the original at Machine Learning