我知道写入组合写入将被缓存,并且不会直接到达内存。
但是程序员是否有必要在其他人可以访问之前显式刷新该内存?
我从图形驱动程序代码中得到了这个问题。例如,CPU填充顶点缓冲区(映射为WC)。但在GPU访问它之前,我在代码中没有看到任何刷新操作。
架构(x86)已经为我们解决这个问题了吗?有关于这个的更详细的文档吗?
根据英特尔® 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 寄存器的写入(如果映射到未缓存的内存)将刷新写入组合缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)