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

PyCuda - use *.cubin - named symbol not found

我尝试将已编译的 *.cubin 文件与 PyCuda 一起使用,但出现此错误:

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;
}