2013-10-20 39 views

回答

2

如果您使用的机器具有连贯的缓存(大多数主流机器),则通常不需要缓存行刷新,并且flush指令不太可能对缓存做任何明确的操作。在一个连贯的系统中,任何写入一个内核缓存的内容都可以立即被所有其他内核看到。

但是,FLUSH指令可能充当内存屏障或fence,并且它还会强制编译器为其可能已存储在寄存器中的值生成存储指令。

有指令here,包括本说明的一个很好的说明:

Q17:是对$ OMP冲水指令所必需的高速缓存一致性的系统上!?

A17:是的flush指令是必要的。查看OpenMP规范中的使用示例。该指示对于指示编译器必须将该变量写入存储器系统/从存储器系统读取是必需的,即,该变量不能通过代码中的刷新“语句”保存在本地CPU寄存器中。

缓存一致性确保了如果一个CPU执行从/到内存的读取或写入指令,则系统中的所有其他CPU在访问时都会从该内存地址获取相同的值。所有缓存都将显示一个连贯的值。但是,在OpenMP标准中,必须有一种方法来指示编译器实际插入读/写机器指令,而不是延迟它。为循环生成高效的机器语言代码时,将循环变量保存在寄存器中是非常常见的。

如果您使用的机器具有非一致性缓存,那么您可能正在使用超级计算机,并应咨询熟悉您的体系结构和工具集的本地专家。

+0

谢谢,这解释了它。 – user2887306