# Generated by tools/check_code.py. Build and run every example on a machine with an NVIDIA GPU.
NVCC ?= nvcc
NVCC_EXTRA ?=
BINS := gemm_cp_async tma_copy cluster_sum flash_attn paged_decode gemv_w4 wmma_gemm mma_sync divergence occupancy vector_add bench_timing grid_stride device_query matrix_add access_pattern bank_conflict conv1d block_sum histogram atomic_max_float gemm reduction argmax scan compact softmax rmsnorm layernorm transpose cublas_gemm pdl_chain nvtx_demo overlap cuda_graph managed_prefetch
EXTRA := cute_algebra cute_layout nccl_allreduce

all: $(BINS)

extra: $(EXTRA)   # examples that need NCCL (and 2+ GPUs) or CUTLASS (set CUTLASS_DIR)

gemm_cp_async: gemm_cp_async.cu common.cuh
	$(NVCC) -O3 -arch=sm_80 -std=c++17 $(NVCC_EXTRA) gemm_cp_async.cu -o $@

tma_copy: tma_copy.cu common.cuh
	$(NVCC) -O3 -arch=sm_90 -lcuda -std=c++17 $(NVCC_EXTRA) tma_copy.cu -o $@

cluster_sum: cluster_sum.cu common.cuh
	$(NVCC) -O3 -arch=sm_90 -std=c++17 $(NVCC_EXTRA) cluster_sum.cu -o $@

flash_attn: flash_attn.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) flash_attn.cu -o $@

paged_decode: paged_decode.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) paged_decode.cu -o $@

cute_algebra: cute_algebra.cu common.cuh
	$(NVCC) -std=c++17 -arch=sm_80 -I${CUTLASS_DIR}/include -std=c++17 $(NVCC_EXTRA) cute_algebra.cu -o $@

gemv_w4: gemv_w4.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) gemv_w4.cu -o $@

wmma_gemm: wmma_gemm.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) wmma_gemm.cu -o $@

mma_sync: mma_sync.cu common.cuh
	$(NVCC) -O3 -arch=sm_80 -std=c++17 $(NVCC_EXTRA) mma_sync.cu -o $@

divergence: divergence.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) divergence.cu -o $@

occupancy: occupancy.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) occupancy.cu -o $@

vector_add: vector_add.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) vector_add.cu -o $@

bench_timing: bench_timing.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) bench_timing.cu -o $@

grid_stride: grid_stride.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) grid_stride.cu -o $@

device_query: device_query.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) device_query.cu -o $@

matrix_add: matrix_add.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) matrix_add.cu -o $@

access_pattern: access_pattern.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) access_pattern.cu -o $@

bank_conflict: bank_conflict.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) bank_conflict.cu -o $@

conv1d: conv1d.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) conv1d.cu -o $@

block_sum: block_sum.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) block_sum.cu -o $@

histogram: histogram.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) histogram.cu -o $@

atomic_max_float: atomic_max_float.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) atomic_max_float.cu -o $@

gemm: gemm.cu common.cuh
	$(NVCC) -O3 -arch=sm_80 -std=c++17 $(NVCC_EXTRA) gemm.cu -o $@

reduction: reduction.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) reduction.cu -o $@

argmax: argmax.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) argmax.cu -o $@

scan: scan.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) scan.cu -o $@

compact: compact.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) compact.cu -o $@

softmax: softmax.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) softmax.cu -o $@

rmsnorm: rmsnorm.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) rmsnorm.cu -o $@

layernorm: layernorm.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) layernorm.cu -o $@

transpose: transpose.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) transpose.cu -o $@

cublas_gemm: cublas_gemm.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -lcublas -std=c++17 $(NVCC_EXTRA) cublas_gemm.cu -o $@

cute_layout: cute_layout.cu common.cuh
	$(NVCC) -std=c++17 -I${CUTLASS_DIR}/include -std=c++17 $(NVCC_EXTRA) cute_layout.cu -o $@

nccl_allreduce: nccl_allreduce.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -lnccl -std=c++17 $(NVCC_EXTRA) nccl_allreduce.cu -o $@

pdl_chain: pdl_chain.cu common.cuh
	$(NVCC) -O3 -gencode arch=compute_75,code=compute_75 -gencode arch=compute_90,code=sm_90 -gencode arch=compute_90,code=compute_90 -std=c++17 $(NVCC_EXTRA) pdl_chain.cu -o $@

nvtx_demo: nvtx_demo.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) nvtx_demo.cu -o $@

overlap: overlap.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) overlap.cu -o $@

cuda_graph: cuda_graph.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) cuda_graph.cu -o $@

managed_prefetch: managed_prefetch.cu common.cuh
	$(NVCC) -O3 -arch=sm_75 -std=c++17 $(NVCC_EXTRA) managed_prefetch.cu -o $@

run: all
	@for b in $(BINS); do echo "=== $$b"; ./$$b || echo "!!! $$b exited with an error"; done

clean:
	rm -f $(BINS) $(EXTRA)

.PHONY: all extra run clean
