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

Ban*_*ana 7 python cuda boost-python pycuda

我有一个用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];
    // ... 
}
"""
Run Code Online (Sandbox Code Playgroud)

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

感谢帮助!

tal*_*ies 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'])
Run Code Online (Sandbox Code Playgroud)

它应该自动工作(注意未经测试,使用风险自负).

  • 以下是解决方案:[在PyCUDA中使用C++函数模板](http://wiki.tiker.net/PyCuda/Examples/C%2B%2BFunctionTemplates) (3认同)