Python中如何正确打印GPU变量的GPU端真实地址
现象原因
Python内置的id()函数返回的是Python对象自身在主机CPU内存中的唯一标识地址,和张量底层存储实际数据的位置没有关系。
不管张量是分配在CPU内存还是GPU显存上,你在Python代码中操作的torch.Tensor本质是一个存在于主机内存中的包装对象,内部只保存张量的形状、数据类型、步长、指向对应设备上真实数据存储的指针这类元信息。你测试代码里a = torch.tensor([1,2,3])在主机内存创建了一个Tensor包装对象,执行b = a.to('cuda:2')时会在主机内存再创建一个全新的Tensor包装对象,两个对象都在当前Python进程的主机内存堆上分配,返回的id值接近是完全正常的,这俩值从头到尾都和GPU显存地址没有关联。
正确获取GPU显存真实地址的方法
要获取张量底层存储数据的真实地址,不要用id(),直接调用PyTorch张量自带的data_ptr()方法即可:
- 对CPU张量,该方法返回张量数据在主机内存中的起始地址
- 对GPU张量,该方法返回张量数据在对应CUDA设备显存中的起始地址
对应测试代码如下:
import torch a = torch.tensor([1, 2, 3]) print(f"CPU张量的Python包装对象地址(id返回值): {id(a)}") print(f"CPU张量数据在主机内存的真实地址: {a.data_ptr()}") b = a.to('cuda:2') print(f"GPU张量的Python包装对象地址(id返回值): {id(b)}") print(f"GPU张量所在设备: {b.device}") print(f"GPU张量数据在cuda:2显存中的真实地址: {b.data_ptr()}")
注意:
data_ptr()返回的地址属于对应设备的独立地址空间,CPU内存地址和GPU显存地址不处于同一个地址空间,二者的数值没有可比性,不能直接跨设备对地址做解引用操作。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

