Python 通过C++/CUDA类到PyCUDA';s源模块 我有一个C++语言的类,它还使用了一些来自CUAAYRunTime.h的定义,这是一个名为ADOR-C的开源项目的一部分,你可以看一下!p>

Python 通过C++/CUDA类到PyCUDA';s源模块 我有一个C++语言的类,它还使用了一些来自CUAAYRunTime.h的定义,这是一个名为ADOR-C的开源项目的一部分,你可以看一下!p>,python,cuda,boost-python,pycuda,Python,Cuda,Boost Python,Pycuda,当我使用CUDA-C时,这是可行的,但是如果有可能的话,我想以某种方式在PyCUDA中导入这个类。因此,我将在内核(而不是“main”)中使用这个类来定义用于计算函数导数的特定变量。有没有办法将这个类传递给PyCUDA的SourceModule 我问了一个类似的问题,但在这里我想解释更多。因此,有一种解决方案可以使用nvcc-cubin(感谢Talonmes)编译我的C代码,然后从_file()中使用driver.module_导入代码,但是,我希望使用SourceModule并将这些内核写入.

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

我问了一个类似的问题,但在这里我想解释更多。因此,有一种解决方案可以使用nvcc-cubin(感谢Talonmes)编译我的C代码,然后从_file()中使用driver.module_导入代码,但是,我希望使用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];
    // ... 
}
"""
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'])
。。。这只是一个想法,但是SourceModule不知道什么是“adouble”,因为它们是在类定义adoublecuda.h中定义的,所以我希望您现在更好地理解我的问题。有人知道我应该从哪里开始吗?如果没有,我将用CUDA-C编写内核,并使用nvcc-cubin选项


谢谢你的帮助

PyCUDA SourceModule系统实际上只是一种将您传递的代码获取到文件中、使用
nvcc
将该文件编译到cubin文件中以及(可选)将该cubin文件加载到当前CUDA上下文中的方法。PycUDA编译器模块对CUDA内核语法或代码一无所知,并且几乎对编译的代码没有影响(几乎限定符是因为它可以用<代码>外部的用户提交代码”C“{} /代码>声明来停止C++符号的修改”。 因此,要完成我认为您要问的事情,您只需要在提交的字符串中为您的设备代码需要的任何标题提供一个
#include
语句,以及一组合适的搜索路径 在通过
include_dirs
关键字选项传递的python列表中。如果您这样做:

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];
    // ... 
}
"""
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'])

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

哇,这就是我一直在寻找的解决方案!我只想包含这个头文件,这样我的内核就知道adouble类的定义在哪里,但我不知道如何定义。我不会在“main”中使用这个adouble类,但我需要弄清楚如何从gpu获取这个adouble数组。正如您所看到的,一个double类只有两个私有成员:
double-val
double-ADVAL
也许我需要在python中创建一个与此类似的结构。非常感谢你帮助我!当我试图包含这个类时,我得到了太多的错误,比如:“这个声明可能没有外部“C”链接”。我是否需要更改adoublecuda.h或其他内容?正如我在回答中指出的,SourceModule可以用
extern“C”{}
声明将代码字符串括起来。在代码中使用纯C++定义,您不需要这样做。您可以使用
no\u extern\u c=True
关键字参数禁用该行为。输出中将有符号损坏,您可能需要在Python代码中考虑这一点。我现在还没有一个可以运行的PyCUDA安装来测试。是的,如果我使用这样的语句:
mod=SourceModule(kernel\u code\u模板,include\dirs=['path/to/adoublecuda',no\u extern\u c=True)
那么我在尝试访问
myfunction
时会遇到一个错误,比如:“cuModuleGetFunction失败:找不到”以下是解决方案: