7

我有一个用 C++ 编写的类,它也使用了 cuda_runtime.h 中的一些定义,这是名为 ADOL-C 的开源项目的一部分,你可以看看这里

这在我使用 CUDA-C 时有效,但我想以某种方式在 PyCUDA 中导入这个类,如果有可能的话。所以,我将在内核内部(不在“main”中)使用这个类来定义用于计算函数导数的特定变量。有没有办法将这个类传递给 PyCUDA 的 SourceModule?

我问了一个类似的问题,但在这里我想解释一下。因此,有一个解决方案使用 nvcc -cubin 编译我的 C 代码(感谢 talonmies),然后使用 driver.module_from_file() 导入它,但是,我想使用 SourceModule 并将这些内核写入 .py 文件中,所以它可以更加用户友好。我的示例如下所示:

from pycuda import driver, gpuarray
from pycuda.compiler import SourceModule
import pycuda.autoinit
kernel_code_template="""
__global__ void myfunction(float* inx, float* outy, float* outderiv)
{
    //defining thread index
    ...
    //declare dependent and independet variables as adoubles
    //this is a part of my question
    adtl::adouble y[3];
    adtl::adouble x[3];
    // ... 
}
"""

...这只是一个想法,但 SourceModule 不会知道什么是“adouble”,因为它们是在类定义 adoublecuda.h 中定义的,所以我希望你现在能更好地理解我的问题。有谁知道我应该从哪里开始?如果没有,我将在 CUDA-C 中编写这个内核,并使用 nvcc -cubin 选项。

感谢帮助!

4

1 回答 1

7

PyCUDA SourceModule 系统实际上只是一种将您传递到文件中的代码、将该文件编译nvcc为 cubin 文件以及(可选)将该 cubin 文件加载到当前 CUDA 上下文中的一种方式。PyCUDA 编译器模块对 CUDA 内核语法或代码一无所知,并且(几乎)对编译的代码没有影响[几乎限定词是因为它可以用extern "C" { }声明将用户提交的代码括起来以停止 C++ 符号修改]。

因此,要执行我认为您要问的问题,您应该只需要#include声明您的设备代码在提交的字符串中需要的任何标头,以及通过include_dirs关键字选项传递的 python 列表中的一组合适的搜索路径。如果你做这样的事情:

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template="""

#include "adoublecuda.h" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ...  
}

""" 

module = SourceModule(kernel_code_template, include_dirs=['path/to/adoublecuda'])

and it should automagically work (note untested, use at own risk).

于 2012-07-02T11:22:20.143 回答