将多个源文件合并为一个 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
开关即可。
为了简化项目中的构建过程,我想将多个源文件编译成设备 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
开关即可。