【问题标题】:PyCUDA + numpy, and working with strings in generalPyCUDA + numpy,一般使用字符串
【发布时间】:2018-06-10 20:05:51
【问题描述】:

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

目前我还在纠结 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 时)

仅使用 C 编写 CUDA 代码可能会更好,但我想探索 python 的功能,我这样做是为了学习。

【问题讨论】:

  • 您有实际问题要问吗?
  • 其实是 2 个问题,我会突出显示它们,以防它们难以发现。

标签: python arrays numpy pycuda


【解决方案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。 PyCUDA 自动理解如何处理这个问题,因为缓冲区协议和底层直接映射到原生 C 类型。

不过你也可以这样做:

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 中没有直接表示。

【讨论】:

  • 非常感谢!您的答案几乎包含了我一直在寻找的一切。此外,我最初尝试在不起作用的内核中使用 char**,并认为正在进行一些转换,但我发现这实际上是 CUDA 的限制,因为数据共享的工作方式。
猜你喜欢
  • 2013-09-19
  • 2018-06-12
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2018-12-01
相关资源
最近更新 更多