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选项.
感谢帮助!
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)
它应该自动工作(注意未经测试,使用风险自负).