将多个源文件合并为一个 fatbinary 的简单方法

Simple way to merge multiple source files into one fatbinary

为了简化项目中的构建过程,我想将多个源文件编译成设备 PTX 代码,并将所有这些模块放在一个 .fatbin 文件中,以便稍后链接。

我目前可以通过将每个文件单独编译为 .ptx 或同时编译所有文件同时使用 --keep 保留中间文件,然后将每个文件显式添加到 fatbinary 来实现此目的:

nvcc -c --keep mysource1.cu mysource2.cu ...
fatbinary --create="mysources.fatbin" --image3=kind=ptx,file=mysource1.ptx --image3=kind=ptx,file=mysource2.ptx ...

虽然这很麻烦,所以我想知道是否有一种 simpler/more 简洁的方法可以做到这一点,也许在单个 nvcc 调用中。我试过在多个源文件上调用 nvcc --fatbin --device-link,但这似乎并没有将 ptx 代码保留在输出 fatbinary 中(至少在使用 cuobjdump 检查时没有)。

这里一种可能的方法是使用库。该命令可能如下所示:

nvcc -gencode arch=compute_XX,code=sm_XX  -gencode ... --lib -rdc=true -o libmy.a mysource1.cu ...

如果您知道最终需要 linking 设备,则可以使用上述命令。在这种情况下,您将在稍后指定 device-link 步骤,当您 link 对象或针对静态库的最终可执行文件时。

如果您知道不需要 linking 设备,只需省略 -rdc=true 开关即可。