【发布时间】:2017-04-06 19:04:18
【问题描述】:
假设我有一个这样的玩具循环
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 BYTE)
现在如果我这样做会发生什么
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 会有所不同。任何人都可以谈谈这件事吗?或者也许澄清一些事情。谢谢
【问题讨论】:
-
这些循环是不等价的——当你写信给
x[k]时,你会影响x[k+1]的计算值。这可以接受吗? -
对不起,这个。逻辑应该是无关紧要的。我只是重复使用相同的循环来突出我的问题。
标签: c++ performance memory-bandwidth roofline