Python PyCUDA+;numpy,并且通常使用字符串

Python PyCUDA+;numpy,并且通常使用字符串,python,arrays,numpy,pycuda,Python,Arrays,Numpy,Pycuda,我对书名中提到的所有东西都比较陌生,所以请耐心听我说 目前我一直在处理python和C之间的转换。因为CUDA内核是用C编写的,所以我不能仅仅用python的方式来看待它 由于文档非常有限,对于初学者来说过于复杂,我想问一下pyCuda实际上是如何转换python(或numpy)数组以在C中使用的。 例如,字符串“stuff”在C中是一个字符数组,但在python中是一个不可变的字符串。但是,我可以做到以下几点: stuff = "stuff" d_stuff = cuda.mem_alloc(

我对书名中提到的所有东西都比较陌生,所以请耐心听我说

目前我一直在处理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_文件

但是,我不能以相同的方式获取它,因为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时)

只使用C编写CUDA代码可能会更好,但我想探索python的特性,我做这些都是为了学习

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

没有。PyCUDA只需获取任何支持Python的对象(通常是numpy数组),并直接访问其主机内存缓冲区,以便在GPU之间传输数据。从未执行过类型转换或数据操作。类型直接从中推断(通常通过numpy,因为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数组包含Python对象(在本例中为字符串)。这不是PyCUDA中可以使用的东西,因为Python对象在C中没有直接表示形式。

您有实际问题要问吗?事实上,我将突出显示2个问题,以防它们难以识别。非常感谢!你的答案几乎包含了我想要的一切。此外,我最初尝试在一个不起作用的内核中使用char**,并认为有一些转换正在进行,但我发现,由于数据共享的工作方式,这实际上是CUDA的一个限制。
ttt = np.asarray([ "stuff" + str(i)  for i in range(0,20) ], dtype=object)

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