创建LoDTensor数据结构:tensor
place = fluid.CUDAPlace(0)
tensor = fluid.LoDTensor()
tensor.set(1, place)
print(tensor)
输出:
paddle.fluid.core.LoDTensor object at 0x7fdb480bc110
然后,在该数据地址:0x7fdb480bc110 上通过numba.cuda.cudadrv.devicearray.DeviceNDArray数据结构对tensor重新赋值。
最后,print(np.array(tensor))
报错:
terminate called after throwing an instance of 'paddle::platform::EnforceNotMet' what():cudaMemcpy failed in paddle::platform::GpuMemcpySync: an illegal memory access was encountered at [/paddle/paddle/fluid/platform/gpu_info.cc:184]
请问是什么问题导致的?
相关联的issue:
#15221
代码片段:
4条答案
按热度按时间zbdgwd5y1#
结合#15221 里面的讨论,你应该是想拿到tensor的gpu内存地址。但你拿到的这个地址应该是tensor这个对象的地址,而不是tensor所用户的data的地址,我特意在c++里面加了打印。
python代码为:
输出为:
vecaoik12#
谢谢解答!那paddle如何拿到上面定义的tensor的gpu内存地址呢?有暴露的python方法吗?
niknxzdl3#
python端应该没办法获取到tensor的data的gpu地址。你是希望GPU数据直接传输到GPU tensor吗?可否按#15221 中的建议,先传输回CPU numpy array中,再用numpy array初始化GPU tensor?
uelo1irk4#
感谢解答!
1、确实是想直接共享gpu数据,想省去cpu到gpu间的拷贝,想通过gpu内存的零拷贝来实现其它数据结构到paddle数据结构兼容。
2、我是否可自己定义python方法从C++中获取tensor的data的gpu地址?(是如何操作的?)
3、另一个问题:paddle的tensor存储结构是怎样的,是否也是分为头信息区和存储区,在头信息区保存
tensor的size、stride、type等信息,在存储区保存实际数据,多个头信息区可对应同一个存储区这样。
4、paddle是否有相关的文档资料(关于paddle内存结构和内存管理共享之类的)