【问题标题】:CUDA calling function in different program不同程序中的CUDA调用函数
【发布时间】:2015-09-15 01:32:42
【问题描述】:

在cuda中,是否可以调用在不同程序中定义的设备函数?

我想要一个包含多个设备函数的程序,然后创建不同的内核(可以在不同的cubin中编译),但能够调用这些函数。

所以,我想要的是:

  • 具有实用函数 A、B 和 C 的 cubin
  • 能够调用函数 A 和 B 的 cubin
  • 能够调用函数 A 和 C 的 cubin

有没有办法做到这一点?

还有一个类似的问题,CUDA中是否可以有一种类似于GLSL中的子程序的函数指针?

【问题讨论】:

  • 如果你想问CUDA是否支持设备代码库,答案是肯定的
  • 我需要做一些特别的事情吗?或者只是按正确的顺序加载模块?
  • 在 NVIDIA 开发者论坛的 this thread 中,我展示了一个关于如何创建和使用适用于 Linux 和 Windows 的设备代码库的最小工作示例。
  • 你有cubins的例子吗?在您的示例中,项目链接在一起。但我想要单独的 cubin 文件。然后可以动态加载它们,有点像插件或 DLL。

标签: cuda glsl


【解决方案1】:

你不能使用 cubin 来做到这一点。

在 CUDA 中,不可能编译成具有不满足依赖关系的 cubin 文件。所有 CUDA 代码必须在编译时可供汇编器/链接器使用,无论是在目标文件还是库中。如果你不这样做,cubin 组装阶段将在不满足的依赖项中失败。因此,您的建议行不通。设备函数指针在 CUDA 中的工作方式也排除了使用运行时指针分配将以前的匿名函数传递给内核的可能性。这是因为无法在运行时使用主机 API 从 cubin 获取设备函数句柄。为此需要设备代码,并且由于上述原因,设备代码无法工作。

你有两个选择:

  1. 使用单独的编译和库将实用程序函数构建到服务库中,然后使用设备链接器针对该库构建 cubin
  2. 在运行时使用 JIT PTX 编译和汇编。如果您将所有需要编译为 PTX 的代码,您可以设计一个系统将所有需要的 PTX 代码连接到来自驱动程序 API 的 JIT 编译调用的单个输入中。这应该可以避免在编译时解决所有问题

最后,是的,您可以在 CUDA 中使用函数指针,但如上所述,它们在这里对您没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多