是否有必要由程序员明确刷新组合记忆?

时间:2014-09-23 01:54:24

标签: linux graphics architecture cpu-cache

我知道写入合并写入将被缓存,并且不会直接到达内存。 但是,在其他人可以访问之前,程序员是否有必要明确地刷新这个内存?

我从图形驱动程序代码中得到了这个问题。例如,CPU填充顶点缓冲区(映射为WC)。但在GPU访问它之前,我没有在代码中看到任何刷新操作。 架构(x86)已经为我们解决了这个问题吗?关于这个的更详细的文件?

1 个答案:

答案 0 :(得分:6)

根据英特尔®64和IA-32架构软件开发人员手册,第3A卷:系统编程指南,第1部分(2012年8月版,但不应更改),第11.3.1节,必须刷新缓冲区:

  

用于驱逐WC缓冲区的协议是依赖于实现的,并且软件不应依赖于系统内存一致性。使用WC存储器类型时,软件必须对数据写入系统存储器的事实敏感,并且在需要系统存储器一致性时必须故意清空WC缓冲器。

如果图形驱动程序实际上没有刷新写入组合缓冲区,那么它们取决于系统特定的时序和/或缓冲区大小(假设后续的WC写入将被分配给缓冲区,这在结构上没有保证)。这可能在普通工作负载下的现有系统上工作(或似乎工作),但在架构上保证不起作用。

由于广泛的序列化事件将刷新写入组合缓冲区,因此很可能存在刷新操作/事件但不明显(如SFENCE所示)。英特尔®64和IA-32架构软件开发人员手册(版本052,2014年9月),第3卷,第11.3节可用的缓存方法:

  

如果WC缓冲区被部分填充,则写入可能会延迟,直到下一次出现序列化事件为止;例如,SFENCE或MFENCE指令,CPUID执行,对未缓存的存储器的读或写,中断发生或LOCK指令的执行。

例如,写入GPU寄存器(如果映射到未缓存的内存)将刷新写入组合缓冲区。