将C ++ / CUDA类传递给PyCUDA的SourceModule

时间:2012-07-02 08:54:52

标签: python cuda boost-python pycuda

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

这在我使用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选项。

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

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'])

它应该自动运行(注意未经测试,自担风险使用)。