程序员需要显式地清空写组合内存吗?

3

我知道写合并写入会被缓存,不会直接到达内存。但程序员在其他人可以访问之前是否需要显式刷新这个内存呢?

我从图形驱动程序代码中得到了这个问题。例如,CPU填充顶点缓冲区(作为WC映射)。但在GPU访问它之前,我没有看到代码中有任何刷新操作。

架构(x86)已经为我们处理了吗?有关此事的更多详细文档在哪里?

1个回答

10
根据《Intel® 64和IA-32架构软件开发人员手册,第3A卷:系统编程指南,第1部分》(2012年8月版,但这应该没有改变),第11.3.1节,必须刷新缓冲区:
引用如下:
“清除WC缓冲区的协议取决于实现,并且不应依赖软件进行系统内存一致性。使用WC内存类型时,软件必须注意到数据写入系统内存被延迟,并且在需要系统内存一致性时必须故意清空WC缓冲区。”
如果图形驱动程序实际上没有刷新写组合缓冲区,则它们依赖于特定于系统的时间和/或缓冲区大小(同时假设随后的WC写入将被分配到缓冲区,这并不是体系结构保证的)。这可能适用于现有系统下的普通工作负载(或看起来适用),但不能保证在体系结构下工作。
由于广泛的序列化事件将刷新写组合缓冲区,因此刷新操作/事件很可能存在,但不明显(如SFENCE)。从《Intel® 64和IA-32架构软件开发人员手册》(版本052,2014年9月),第3卷,第11.3节可得:
引用如下:
“如果WC缓冲区部分填充,则写入可能会延迟到下一次序列化事件(例如,SFENCE或MFENCE指令,CPUID执行,读取或写入未缓存的内存,中断发生或LOCK指令执行)。”
例如,对GPU寄存器的写入(如果映射到未缓存的内存)将刷新写组合缓冲区。

非常详细的答案。我被困惑了很长时间,现在很清晰了。非常感谢! - zhebin jin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接