You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过内存地址访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:57:00