如何让 PyC​​uda SourceModule 编译包含设备代码的多个源文件?

How to get PyCuda SourceModule to compile multiple source files containing device code?

我正在尝试在 CUDA 内核中使用一些 LAPACKE 函数来求解小型线性方程组。我有一个主源文件,其中包含我要调用的内核函数。在该内核函数中,我想调用 LAPACKE 函数 LAPACKE_dgesv(),它在不同的源文件中定义。

在我的主源文件中,我包含了头文件 lapacke.h,其中包含 LAPACKE_dgesv() 的声明。此外,我编辑了 lapacke.h 以将 __device__ 添加到 LAPACKE_dgesv().

的函数声明中

我在 Python 代码中将包含 LAPACKE_dgesv() 定义的源文件目录添加到 SourceModule 调用的 include_dirs 参数中。但是,当我 运行 代码时,出现此错误:

ptxas fatal   : Unresolved extern function 'LAPACKE_dgesv'

我的猜测是包含 LAPACKE_dgesv() 定义的源文件没有被编译。

有没有办法让PyCuda编译包含设备代码的多个源文件?似乎 PyCuda 需要一种方法来 运行 带有 --relocatable-device-code=true 标志的 CUDA 编译器。

不,您不能使用 SourceModule 执行此操作。

有一个实验性的 DynamicSourceModule 最近被添加到 Master 分支,它可能可以做你想做的事,虽然它没有很好的文档记录而且我从未使用过它。否则,您始终可以在 PyCUDA 之外自行将代码静态编译和设备 link 到 cubin 文件,然后通过标准 API 加载生成的设备代码。