【发布时间】:2022-01-02 21:07:24
【问题描述】:
为了简化项目中的构建过程,我想将多个源文件编译成设备 PTX 代码,并将所有这些模块放在一个 .fatbin 文件中,以便稍后链接。
我目前可以通过将每个文件单独编译到.ptx 来实现这一点,或者在使用--keep 保留中间文件时同时编译所有文件,然后将每个文件显式添加到胖二进制文件中:
nvcc -c --keep mysource1.cu mysource2.cu ...
fatbinary --create="mysources.fatbin" --image3=kind=ptx,file=mysource1.ptx --image3=kind=ptx,file=mysource2.ptx ...
虽然这很麻烦,所以我想知道是否有更简单/更简洁的方法,也许在单个 nvcc 调用中。我试过在多个源文件上调用nvcc --fatbin --device-link,但这似乎并没有将ptx代码保留在输出fatbinary中(至少在使用cuobjdump检查时不会)。
【问题讨论】:
-
我不太确定您使用
nvcc -c ...和fatbinary ...的方法实际上是在进行设备链接。如果您在mysource1.cu ...等中的代码实际上需要它,那么您的第一个编译命令将失败并出现错误(ptxas unresolved extern)。因此,如果我们将设备链接放在一边,在我看来,无论如何您都可以使用库来执行此操作:nvcc -arch=sm_XX --lib -rdc=true -o lib.a mysource1.cu ...如果您的代码需要设备链接,您可以稍后在链接库时指定。 -
确实,在我的情况下,我认为设备链接不是必需的,我只是在尝试似乎接受多个输入源文件的场景。在创建静态库时:确实有效!我最初忽略了它,因为我认为它们只支持单一架构,并且只有 fatbinaries 可以包含不同架构的 PTX 文件。我刚刚意识到您仍然可以通过设置
--lib来提供 nvcc 多个--gencode=arch,code参数。谢谢@RobertCrovella!