2012-07-02 55 views
6

我有一个用C++编写的类,它也使用cuda_runtime.h中的一些定义,这是来自名为ADOL-C的开源项目的一部分,您可以看看here将C++/CUDA类传递给PyCUDA的SourceModule

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

我问了一个类似的问题,但在这里我想解释更多一点。因此,有一个解决方案使用nvcc -cubin(感谢talonmies)编译我的C代码,然后用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选项。

感谢您的帮助!

回答

6

PyCUDA SourceModule系统实际上只是一种将代码传递到文件中的方法,将nvcc文件编译为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']) 

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

+0

哇,这就是我一直在寻找的解决方案!我只是想包含这个头文件,以便我的内核知道adouble类的定义在哪里,但我不知道如何。我不会在“main”中使用这个adouble类,但是我需要弄清楚如何从gpu获得这个adouble数组。正如你所看到的,adouble类只有两个私有成员: 'double val' 'double ADVAL' 也许我需要在python中创建一个类似于这个的结构体。非常感谢你帮助我! – Banana

+0

当我试图包含这个类时,我得到了太多的错误:“这个声明可能没有extern”C“链接”。我需要更改adoublecuda.h还是有其他的东西? – Banana

+0

正如我在我的回答中指出的那样,SourceModule可以使用'extern“C”{}'声明括住代码字符串。在你的代码中使用纯粹的C++定义,你不需要它。您可以使用'no_extern_c = True'关键字参数禁用该行为。输出中会有符号混乱,您可能需要在Python代码中使用它。我目前没有正在运行的PyCUDA安装来测试。 – talonmies