我有一个用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选项。
感谢您的帮助!
哇,这就是我一直在寻找的解决方案!我只是想包含这个头文件,以便我的内核知道adouble类的定义在哪里,但我不知道如何。我不会在“main”中使用这个adouble类,但是我需要弄清楚如何从gpu获得这个adouble数组。正如你所看到的,adouble类只有两个私有成员: 'double val' 'double ADVAL' 也许我需要在python中创建一个类似于这个的结构体。非常感谢你帮助我! – Banana
当我试图包含这个类时,我得到了太多的错误:“这个声明可能没有extern”C“链接”。我需要更改adoublecuda.h还是有其他的东西? – Banana
正如我在我的回答中指出的那样,SourceModule可以使用'extern“C”{}'声明括住代码字符串。在你的代码中使用纯粹的C++定义,你不需要它。您可以使用'no_extern_c = True'关键字参数禁用该行为。输出中会有符号混乱,您可能需要在Python代码中使用它。我目前没有正在运行的PyCUDA安装来测试。 – talonmies