魔改的C++编译器,包含在cuda-toolkit中
nvcc 会自动加上 CUDA 相关的库和头文件路径,而 g++ 自己不会
当你用 nvcc 编译 .cu 文件时,它会自动:
# 指定目标硬件架构(未测试)
nvcc -gencode=arch=compute_75,code=sm_75 \
-gencode=arch=compute_86,code=sm_86 \
main.cu -o main
关闭编译器优化:
-G #生成debug symbols并且关闭优化(Device)
-O0 #关闭优化(Device)
-Xcompiler -O0 #关闭优化(Host)
-Xcompiler -g #生成debug symbols(Host)
--expt-relaxed-constexpr # 让 CUDA 支持更宽松的 constexpr(常量表达式)语义,特别是让很多原本 # 只在主机(host)端支持的 constexpr 代码也能在设备(device)端(GPU)正常编译通过 --extended-lambda # 让 CUDA 支持捕获局部变量(by value or reference)的 lambda 表达式可以直接用在 device 代码里
nvcc main.cu -o main
说明:
main.cu 是包含 CUDA 代码的源文件。-o main 指定输出可执行文件名称。nvcc file1.cu file2.cu -o app
nvcc -c file1.cu -o file1.o nvcc -c file2.cu -o file2.o nvcc file1.o file2.o -o app
nvcc -c kernel.cu -o kernel.o
nvcc -c kernel.cu -o kernel.o ar rcs libkernel.a kernel.o
使用示例:
g++ main.cpp -L. -lkernel -o app
注意:
nvcc 链接而不是 g++,或者添加 -lcudart 等 CUDA 依赖。nvcc -Xcompiler -fPIC -shared kernel.cu -o libkernel.so
使用时:
g++ main.cpp -L. -lkernel -o app -Wl,-rpath=.
或者用 nvcc:
nvcc main.cpp -L. -lkernel -o app -Wl,-rpath=.
main.cpp:普通 C++ 程序kernel.cu:CUDA 核函数编译过程:
nvcc -c kernel.cu -o kernel.o g++ -c main.cpp -o main.o nvcc main.o kernel.o -o app
说明:
nvcc 作为链接器更安全,因为它知道如何链接 CUDA runtime(-lcudart 等)。nvcc -I./include -L./lib -lkernel main.cu -o app
| 选项 | 含义 |
|---|---|
-G | 生成调试信息(关闭优化) |
-O3 | 最高优化等级 |
--ptxas-options=-v | 显示寄存器/共享内存使用 |
-arch=sm_XX | 指定架构(如 sm_75) |
--compiler-options | 向主机编译器传递选项(如 -Wall) |
CUDA_PATH := /usr/local/cuda NVCC := $(CUDA_PATH)/bin/nvcc SRCS := main.cpp kernel.cu OBJS := $(SRCS:.cu=.o) TARGET := app all: $(TARGET) %.o: %.cu $(NVCC) -c $< -o $@ %.o: %.cpp g++ -c $< -o $@ $(TARGET): $(OBJS) $(NVCC) $(OBJS) -o $@ clean: rm -f *.o $(TARGET)