假设我有以下代码:
int x[200];
void thread1() {
for(int i = 0; i < 100; i++)
x[i*2] = 1;
}
void thread2() {
for(int i = 0; i < 100; i++)
x[i*2 + 1] = 1;
}
假设页面在Linux中配置了默认的写缓存策略,x86-64内存模型中的代码是否正确(根据我的理解)?对此类代码的性能有何影响(据我所知 - 没有)?
PS。表演 - 我最感兴趣的是Sandy Bridge。
编辑:按照预期 - 我想写入来自不同线程的对齐位置。我希望完成后屏幕上方的代码包含{1,1,1, ...}
中的x
,而不是{0,1,0,1,...}
或{1,0,1,0,...}
。
答案 0 :(得分:1)
如果我理解正确,写入最终会通过窥探请求传播。 Sandy Bridge在核心之间使用快速路径,因此窥探不会攻击FSB,但会使用更快的互连。因为它不是基于写入时的高速缓存失效,所以它应该“相当”快速,尽管我无法找到冲突解决的开销(但可能低于L3写入)。
编辑:根据Intel® 64 and IA-32 Architectures Optimization Reference Manual清理命中有43个周期的影响,脏命中有60个周期的影响(相比之下,L1的4个周期正常开销,L2和26个的12个L3为31)。