Pinned Memory

理论上其通过将数据放在锁页内存,且通过异步传输可以加速数据从内存到显存的传递速率

其案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os
import time
import numpy as np
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader


# ===== 自动生成 CSV 文件 =====
csv_path = r"E:\data\data.csv"
if not os.path.exists(csv_path):
N = 1000000 # 行数,可以调大
M = 21 # 列数,最后一列作为 label
df = pd.DataFrame(np.random.randn(N, M))
df.to_csv(csv_path, index=False)
print(f"已生成测试文件 {csv_path}")


# ===== 自定义 Dataset =====
class CSVDataset(Dataset):
def __init__(self, csv_path):
self.data = pd.read_csv(csv_path)

def __len__(self):
return len(self.data)

def __getitem__(self, idx):
row = self.data.iloc[idx]
x = torch.tensor(row.iloc[:-1].values, dtype=torch.float32)
y = torch.tensor(row.iloc[-1], dtype=torch.float32) # ✅ 改这里
return x, y


# ===== 测试函数 =====
def run_dataloader(csv_path, pin_memory=False):
dataset = CSVDataset(csv_path)

dataloader = DataLoader(
dataset,
batch_size=1024,
shuffle=True,
num_workers=2,
pin_memory=pin_memory # 锁页内存,固定放在某个页面,可加速数据拷贝
)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

start = time.time()
for data, target in dataloader:
# 关键:用 non_blocking=True
data = data.to(device, non_blocking=True) # 异步传输
target = target.to(device, non_blocking=True) # 异步传输
# 模拟训练计算
_ = data * 2.0 + 1.0
end = time.time()

print(f"pin_memory={pin_memory}, time={end-start:.4f} s")


if __name__ == "__main__":
run_dataloader(csv_path, pin_memory=False)
run_dataloader(csv_path, pin_memory=True)

不过就结果而言,基本没带来提升,甚至很多情况下还带来负面反馈,建议谨慎使用

未来有待进一步研究的点:

1.定位实验中未能展现效果的原因并总结影响因素

2.利用该方案成功实现正向效果