NVCC ?= nvcc
# NVCCFLAGS ?= -O3 -std=c++17 -lineinfo -arch=sm_89
BIN_DIR := build

# 自动探测 compute capability（优先用 nvidia-smi，回退到 deviceQuery）
ifndef ARCH
  CUDA_GENCODE := $(shell nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null | head -n1 | tr -d '.')
  ifeq ($(CUDA_GENCODE),)
    $(warning nvidia-smi 未检测到 GPU，尝试 nvcc 默认架构...)
    ARCH := sm_89   # 最后的保守回退
  else
    ARCH := sm_$(CUDA_GENCODE)
  endif
endif

NVCCFLAGS := -O3 -std=c++17 -lineinfo -arch=$(ARCH)

# 打印当前使用的架构（方便确认）
$(info [INFO] 编译目标架构: $(ARCH))


TARGETS := $(BIN_DIR)/device_info $(BIN_DIR)/l2_latency $(BIN_DIR)/l2_retention \
	$(BIN_DIR)/memory_saturation $(BIN_DIR)/l2_topology 
# 	$(BIN_DIR)/placement_sched $(BIN_DIR)/topology_stability 

.PHONY: all clean paper

all: $(TARGETS)

$(BIN_DIR):
	mkdir -p $@

$(BIN_DIR)/device_info: src/device_info.cu | $(BIN_DIR)
	$(NVCC) $(NVCCFLAGS) $< -o $@

$(BIN_DIR)/l2_latency: src/l2_latency.cu | $(BIN_DIR)
	$(NVCC) $(NVCCFLAGS) $< -o $@

$(BIN_DIR)/l2_retention: src/l2_retention.cu | $(BIN_DIR)
	$(NVCC) $(NVCCFLAGS) $< -o $@

$(BIN_DIR)/memory_saturation: src/memory_saturation.cu | $(BIN_DIR)
	$(NVCC) $(NVCCFLAGS) $< -o $@

$(BIN_DIR)/l2_topology: src/l2_topology.cu | $(BIN_DIR)
	$(NVCC) $(NVCCFLAGS) $< -o $@

# $(BIN_DIR)/topology_stability: src/topology_stability.cu | $(BIN_DIR)
# 	$(NVCC) $(NVCCFLAGS) $< -o $@

# $(BIN_DIR)/placement_sched: src/placement_sched.cu | $(BIN_DIR)
# 	$(NVCC) $(NVCCFLAGS) $< -o $@


clean:
	rm -rf $(BIN_DIR)

