在阅读PyCUDA文档时,我发现我不明白这段代码是如何工作的
numpy.getbuffer(numpy.intp(int(self.data)))
理论上它应该返回一个指向float的指针,而它接收self.data,这是一个指向浮点数组的指针。
我确信这个问题很简单,但在查看有关书籍中numpy.intp的更多信息后,我找不到任何有用的信息。
答案 0 :(得分:0)
这是来源
https://documen.tician.de/pycuda/tutorial.html?highlight=getbuffer
class DoubleOpStruct:
mem_size = 8 + numpy.intp(0).nbytes
def __init__(self, array, struct_arr_ptr):
self.data = cuda.to_device(array)
self.shape, self.dtype = array.shape, array.dtype
cuda.memcpy_htod(int(struct_arr_ptr), numpy.getbuffer(numpy.int32(array.size)))
cuda.memcpy_htod(int(struct_arr_ptr) + 8, numpy.getbuffer(numpy.intp(int(self.data))))
def __str__(self):
return str(cuda.from_device(self.data, self.shape, self.dtype))
array1 = DoubleOpStruct(numpy.array([1, 2, 3], dtype=numpy.float32), struct_arr)
array2 = DoubleOpStruct(numpy.array([0, 4], dtype=numpy.float32), do2_ptr)
print("original arrays", array1, array2)
在np.float32
的课程输入中,cuda.to_device
返回的内容并不明显。它不能是一个数组,否则int(self.data)
将不起作用。 (与我第一次阅读你的问题self.data
相反,它不是self
的数据缓冲区。它可能是相关的,但它不是缓冲区对象)。
所以表达式必须是这样的:
>>> np.intp(2432353)
2432353
>>> np.getbuffer(np.intp(2432353))
<read-only buffer for 0xb74d1150, size -1, offset 0 at 0xb71dfba0>
>>> np.arange(4.).data
<read-write buffer for 0xb71dda98, size 32, offset 0 at 0xb71df1c0>
cuda.to_device
可能会生成类似数据的数字&#39;价值__array_interface__
:
>>> np.arange(4.).__array_interface__['data']
(148454560, False)
>>> np.arange(4.).__array_interface__['data'][0]
148454560
>>> np.getbuffer(np.intp(int(_)))
<read-only buffer for 0xb74d1150, size -1, offset 0 at 0xb3a0c800>
(作为旁注,np.getbuffer
的Py3版本中不存在numpy
。
无论如何,我在这里看不到任何数据类型游戏。