使用ctypes对cuda分配的内存使用python句柄

2024-04-23 19:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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时,我想,它只是0s

我曾与float*和{}的不同可能性进行过斗争,尤其是{}的工作方式。但我不知道该怎么办。在

至于err返回值,cudaMalloc返回{},但两个cudaMemcpy都返回11。在

python的指针怎么了?帮忙吗?在


Tags: 函数内存numpysizectypescudadadll
1条回答
网友
1楼 · 发布于 2024-04-23 19:30:42

问题在于:

pycu_alloc.restypes = [c_void_p]   

这没用。你想要的是:

^{pr2}$

请参见ctypes文档中的Return types。在

如果不这样,ctypes假设函数返回一个C int。在32位平台上,您可能会逃脱惩罚,因为您最终构建了一个c_void_p,其值是int……但在64位平台上,该指针将以丢失高32位结束。在

所以,当你把它传递给CUDA时,它会识别出指针不在它知道的任何范围内,并返回一个cudaErrorInvalidValue(11)。在

另外,如果你把所有的事情都做对了,这一行应该是不必要的:

c_da = c_void_p(da)

您调用的函数argtypes指定了c_void_p,因此您可以将从c_void_p返回函数得到的int传递给它。在


对于普通的mallocfree,您可以看到相同的行为,除了您可能会在free处得到一个segfault,而不是一个很好的错误:

malloc = libc.malloc
malloc.argtypes = [c_size_t]
malloc.restype = c_void_p # comment this line to crash on most 64-bit platforms

free = libc.free
free.argtypes = [c_void_p]
free.restype = None

a = malloc(1024)
free(a) # commenting this line and uncommenting the next two has no effect
#c_a = c_void_p(a)
#free(ca)

相关问题 更多 >