我尝试使用python通过ctypes控制cuda。这里,为了说明我的问题,我使用python将指针传递给c函数,这些函数分配cuda内存,将numpy数组复制到cuda mempory,并将cuda内存复制回一个新的numpy数组。但它似乎不起作用,尽管我的基本ctypes设置工作正常。我认为问题在于从cudamaloc函数返回到python的内容。在
下面是python代码
pycu_alloc = dll.alloc_gpu_mem
pycu_alloc.argtypes = [c_size_t]
pycu_alloc.restypes = [c_void_p]
host2gpu = dll.host2gpu
host2gpu.argtypes = [c_void_p, c_void_p, c_size_t]
gpu2host = dll.gpu2host
gpu2host.argtypes = [c_void_p, c_void_p, c_size_t]
a = np.random.randn(1024).astype('float32')
c = np.zeros(1024).astype('float32')
c_a = c_void_p(a.ctypes.data)
c_c = c_void_p(c.ctypes.data)
da = pycu_alloc(1024)
c_da = c_void_p(da)
host2gpu(c_a, c_da, 1024)
gpu2host(c_c, c_da, 1024)
print a
print c
还有C:
^{pr2}$代码应该将随机向量a
复制到cuda内存,然后将该cuda内存复制回空向量c
。当我打印c
时,我想,它只是0
s
我曾与float*
和{
至于err
返回值,cudaMalloc
返回{cudaMemcpy
都返回11。在
python的指针怎么了?帮忙吗?在
问题在于:
这没用。你想要的是:
^{pr2}$请参见
ctypes
文档中的Return types。在如果不这样,
ctypes
假设函数返回一个Cint
。在32位平台上,您可能会逃脱惩罚,因为您最终构建了一个c_void_p
,其值是int
……但在64位平台上,该指针将以丢失高32位结束。在所以,当你把它传递给CUDA时,它会识别出指针不在它知道的任何范围内,并返回一个
cudaErrorInvalidValue
(11)。在另外,如果你把所有的事情都做对了,这一行应该是不必要的:
您调用的函数
argtypes
指定了c_void_p
,因此您可以将从c_void_p
返回函数得到的int
传递给它。在对于普通的
malloc
和free
,您可以看到相同的行为,除了您可能会在free
处得到一个segfault,而不是一个很好的错误:相关问题 更多 >
编程相关推荐