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;
}
我尝试将已编译的 *.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;
}