如何通过内存地址访问PyTorch Tensor中的数据
PyTorch通过data_ptr地址构造同数据张量的实现方法
仅靠数据指针adr本身无法直接构造张量,你还需要提前知道原张量的形状、数据类型、所在设备三个核心元信息,data_ptr仅代表数据块的首地址,不会携带张量的元数据。
实现代码
你可以通过PyTorch的底层存储接口实现需求,示例如下:
import torch # 你的原始代码 x = torch.randn(100,100,device='cuda') adr = x.data_ptr() def get_tensor_from_address(ptr, shape, dtype=torch.float32, device='cuda'): # 构造空张量占位,不分配新内存 y = torch.empty(shape, dtype=dtype, device=device) # 将张量的底层存储指向指定地址 if device == 'cuda': storage = torch.cuda.UntypedStorage.from_address(ptr) else: storage = torch.UntypedStorage.from_address(ptr) y.set_(storage, storage_offset=0, size=shape, stride=tuple()) return y # 调用方法,需要传入已知的形状、dtype、设备信息 y = get_tensor_from_address(adr, (100,100)) # 验证:修改y会同步修改x,说明二者指向同一块内存 y[0][0] = 10086 print(x[0][0]) # 输出10086.,符合预期
注意事项
- 元信息必须和原张量完全一致,否则会出现数据乱码、程序直接崩溃等问题
- 该操作不会自动管理内存生命周期:如果原张量
x被销毁、对应内存被PyTorch回收后再访问y,会触发野指针错误 - 仅支持同进程内使用,跨进程的内存地址空间互相隔离,拿到的指针值没有意义
- 如果是CPU张量,调用时指定
device='cpu'即可
内容的提问来源于stack exchange,提问作者Mr Vinagi
相关产品推荐
相关产品推荐

