将多个源文件合并为一个胖二进制文件的简单方法

Posted

技术标签:

【中文标题】将多个源文件合并为一个胖二进制文件的简单方法【英文标题】:Simple way to merge multiple source files into one fatbinary 【发布时间】: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! 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于将多个源文件合并为一个胖二进制文件的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

python 读写和合并二进制bin文件

将两个二进制文件合并为第三个二进制文件

协议缓冲区 - 将具有相同 .proto 文件的二进制数据文件合并到一个文件中

将核心数据文件从二进制转换为 XML

合并 2 个二进制文件。文件之间的剩余数据

如何将几个二进制文件合成一个?