PyCUDA + numpy,一般使用字符串

时间:2017-12-30 22:56:12

标签: python arrays numpy pycuda

我对标题中提到的所有内容都比较新,所以请耐心等待。

目前我一直坚持使用python和C之间的转换。由于CUDA内核是用C语言编写的,所以我不能只用python的方式来看它。

由于文档相当有限,而且初学者过于复杂,我想问一下pyCuda如何实际转换python(或numpy)数组以供在C中使用。

例如,字符串“stuff”是C中的字符数组,但在python中它是一个不可变的字符串。但是我可以做到以下几点:

stuff = "stuff"
d_stuff = cuda.mem_alloc(len(stuff))
cuda.memcpy_htod(d_stuff, stuff)

在CUDA内核中,现在我可以将它用作char * d_stuff。

但是我无法以同样的方式恢复它,因为python字符串是不可变的。因此,执行以下操作显然会引发错误:

newstuff = ""
cuda.memcpy_dtoh(newstuff, d_stuff)

我知道这些可以写成

d_stuff = gpuarray.to_gpu(numpy.array(stuff)) # I need numpy, as the to_gpu expects an array
newstuff = d_stuff.get()

但是我不知道它是如何工作的,以及它在幕后的作用,所以我真的很感激,如果有人能够解释转换是如何工作的话。(例如,第二个例子是怎样的给回一个字符串)

此外,我对使用numpy创建的数组有疑问。我已经看到它们被广泛用于GPU,但我不知道它们是如何工作的。

给numpy一个字符串是否会根据C代码创建一个字符数组,如果是的话,字符串数组会变成char还是其他什么?(当然,当转换为C时)< / p>

仅使用C编写CUDA代码可能会更好,但我想探索python的功能,而我正在为学习目的而做这一切。

1 个答案:

答案 0 :(得分:1)

  

我想问一下PyCUDA如何实际转换python(或numpy)数组以供在C中使用。

没有。 PyCUDA只需要任何支持Python buffer protocol的对象(通常是一个numpy数组),并直接访问其主机内存缓冲区,以便与GPU之间传输数据。 永远执行类型转换或数据操作。类型是从CTypes interface直接推断出来的(通常是通过numpy dtype,因为numpy数组是常用的数据源。)

  

给numpy一个字符串是否会根据C代码创建一个字符数组,如果是的话,字符串数组会变成char还是其他什么?

这取决于。例如,这样做:

ttt = np.asarray([ "stuff" + str(i)  for i in range(0,20) ])

print( ttt.dtype, type(ttt[0]) ) 
|S7 <type 'numpy.string_'>

这里numpy使用一个特殊的固定长度字符串数据类型,其长度是根据输入数据计算的。这对于char[7]的C有序数组是有效的。查看更多here。由于缓冲协议和底层直接映射到本机C类型,PyCUDA自动理解如何处理这个问题。

但是你也可以这样做:

ttt = np.asarray([ "stuff" + str(i)  for i in range(0,20) ], dtype=object)

print( ttt.dtype, type(ttt[0]) )
object <type 'str'>

这里,创建的numpy数组包含Python对象(在本例中为字符串)。这不是可以在PyCUDA中使用的东西,因为Python对象在C中没有直接表示。