Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:cuda:nvcc

NVCC

魔改的C++编译器,包含在cuda-toolkit中

nvcc 会自动加上 CUDA 相关的库和头文件路径,而 g++ 自己不会
当你用 nvcc 编译 .cu 文件时,它会自动:

  1. 添加 CUDA 的头文件路径(如 /usr/local/cuda/include)
  2. 添加 CUDA 的库文件路径(如 /usr/local/cuda/lib64)
  3. 在链接时自动处理一些必要的 CUDA 运行时(如 -lcudart)

常用参数

# 指定目标硬件架构(未测试)
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 代码里

常用编译命令(AI Generated)

一、编译单个 文件为可执行文件

nvcc main.cu -o main

说明:

  • main.cu 是包含 CUDA 代码的源文件。
  • -o main 指定输出可执行文件名称。

二、编译多个 文件并链接为一个可执行文件

方法 1:一次性编译多个

nvcc file1.cu file2.cu -o app

方法 2:先编译成 文件再链接

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

注意:

  • 如果静态库中有 CUDA 核函数,需要用 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=.

六、CUDA 与 C++(g++)代码混合编译与链接

示例结构:

  • 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

九、Makefile 示例(简化管理)

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)
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/cuda/nvcc.txt · Last modified: 2025/07/14 13:53 by zhonghui