假设我有一个这样的玩具循环
float x[N];
float y[N];
for (int i = 1; i < N-1; i++)
y[i] = a*(x[i-1] - x[i] + x[i+1])
我假设我的缓存线是64 字节(即足够大)。然后我将(每帧)基本上 2 次访问 RAM 和 3 次 FLOP:
- 1(缓存)读取访问:加载所有 3
x[i-1], x[i], x[i+1]
- 1个写访问:存储
y[i]
- 3 FLOP (1 mul, 1 add, 1 sub)
操作强度是ergo
OI = 3 FLOP/(2 * 4 字节)
现在如果我做这样的事情会发生什么
float x[N];
for (int i = 1; i < N-1; i++)
x[i] = a*(x[i-1] - x[i] + x[i+1])
请注意,现在没有y
了。这是否意味着我现在只有一个 RAM 访问权限
- 1(缓存)读/写:加载
x[i-1], x[i], x[i+1]
,存储x[i]
或仍然有 2 个 RAM 访问
- 1(缓存)读取:加载
x[i-1], x[i], x[i+1]
- 1(缓存)写入:存储
x[i]
因为在任何一种情况下,操作强度OI都会不同。任何人都可以谈谈这件事吗?或者也许澄清一些事情。谢谢