【发布时间】: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