我有一个用C++编写的类,该类也使用了cuda_runtime.h中的一些定义,这是一个名为ADOL-C的开源项目的一部分,您可以看看here!

当我使用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];
    // ...
}
"""

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

感谢帮助!

最佳答案

PyCUDA SourceModule系统实际上只是一种将传递给您的代码传递到文件中,将带有nvcc的文件编译为cubin文件以及(可选)将该cubin文件加载到当前CUDA上下文中的一种方法。 PyCUDA编译器模块对CUDA内核语法或代码一无所知,并且(几乎)对编译后的代码没有任何影响(几乎限定词是因为它可以用extern "C" { }声明将用户提交的代码括起来以停止C++符号处理)。

因此,按照我认为的要求进行操作,对于提交的字符串中设备代码所需的任何 header ,只需要一个#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'])

并且应该自动运行(请注意,未经测试,使用时需自担风险)。

关于python - 将C++/CUDA类传递给PyCUDA的SourceModule,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11290536/

10-13 08:28