Paddle cudaMemcpy failed in paddle::platform::GpuMemcpySync: an illegal memory access was encountered at [/paddle/paddle/fluid/platform/gpu_info.cc:184]

wwwo4jvm  于 2021-11-30  发布在  Java
关注(0)|答案(4)|浏览(548)

创建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

代码片段:

zbdgwd5y

zbdgwd5y1#

print(tensor)
paddle.fluid.core.LoDTensor object at 0x7fdb480bc110

结合#15221 里面的讨论,你应该是想拿到tensor的gpu内存地址。但你拿到的这个地址应该是tensor这个对象的地址,而不是tensor所用户的data的地址,我特意在c++里面加了打印。

python代码为:

place = fluid.CUDAPlace(0)
tensor = fluid.LoDTensor()
ptr = tensor.set([[1]], place)
print(tensor)

输出为:

mutable_data: 0x7fb178000040
<paddle.fluid.core.LoDTensor object at 0x7fb4156b88f0>
vecaoik1

vecaoik12#

谢谢解答!那paddle如何拿到上面定义的tensor的gpu内存地址呢?有暴露的python方法吗?

niknxzdl

niknxzdl3#

python端应该没办法获取到tensor的data的gpu地址。你是希望GPU数据直接传输到GPU tensor吗?可否按#15221 中的建议,先传输回CPU numpy array中,再用numpy array初始化GPU tensor?

uelo1irk

uelo1irk4#

感谢解答!
1、确实是想直接共享gpu数据,想省去cpu到gpu间的拷贝,想通过gpu内存的零拷贝来实现其它数据结构到paddle数据结构兼容。
2、我是否可自己定义python方法从C++中获取tensor的data的gpu地址?(是如何操作的?)
3、另一个问题:paddle的tensor存储结构是怎样的,是否也是分为头信息区和存储区,在头信息区保存
tensor的size、stride、type等信息,在存储区保存实际数据,多个头信息区可对应同一个存储区这样。
4、paddle是否有相关的文档资料(关于paddle内存结构和内存管理共享之类的)

相关问题