PyCuda - 使用 *.cubin - 未找到命名符号

问题描述

我尝试在 PyCuda 中使用已编译的 *.cubin 文件,但出现此错误

func = mod.get_function("doublify")
pycuda._driver.LogicError: cuModuleGetFunction Failed: named symbol not found

doublify.cu 的内容

    __global__ void doublify(float *a)
    {
        int idx = threadIdx.x + threadIdx.y * 4;
        a[idx] *= 2;
    }

我使用以下命令编译它:

nvcc --cubin -arch sm_75 doublify.cu

这是我的python脚本:

    import pycuda.driver as cuda
    import pycuda.autoinit
    from pycuda.compiler import SourceModule
    import numpy

    a = numpy.random.randn(4,4)
    a = a.astype(numpy.float32)
    a_gpu = cuda.mem_alloc(a.nbytes)

    mod = pycuda.driver.module_from_file("doublify.cubin")

    func = mod.get_function("doublify")
    func(a_gpu,block=(4,4,1))

    cuda.memcpy_dtoh(a_doubled,a_gpu)

    print(a)

我需要向 nvcc 编译器传递额外的标志吗?如果我将它与 Pycuda 的 SourceModule 一起使用,一切都会按预期工作。它也不适用于编译 *.fatbin

解决方法

在调试 PyCuda 本身之后自己弄清楚。如果其他人偶然发现同样的问题,这是解决方案: 我错过了 *.cu 文件开头的 extern "C" 语句。

extern "C"
__global__ void doublify(float *a)
{
        int idx = threadIdx.x + threadIdx.y * 4;
        a[idx] *= 2;
}