【发布时间】:2013-10-20 17:36:22
【问题描述】:
我一直在尝试理解 openmp 编译指示,openmp 刷新 (#pragma omp flush) 会导致缓存行刷新吗?
对于隐式刷新有什么变化?
【问题讨论】:
我一直在尝试理解 openmp 编译指示,openmp 刷新 (#pragma omp flush) 会导致缓存行刷新吗?
对于隐式刷新有什么变化?
【问题讨论】:
如果您使用的是具有一致缓存的机器(大多数主流机器),则通常不需要刷新缓存行,并且刷新指令不太可能对缓存执行任何明确的操作。在一个连贯的系统中,写入一个核心缓存的任何内容都立即对所有其他核心可见。
但是,FLUSH 指令可以充当内存屏障或栅栏,并且它还强制编译器为其可能已存储在寄存器中的值生成存储指令。
对指令here 有很好的描述,包括以下注释:
Q17: !$omp flush 指令在缓存一致性系统上是必需的吗?
A17:是的,flush 指令是必要的。查看 OpenMP 规范以获取其使用示例。该指令对于指示编译器必须将变量写入/读取内存系统是必要的,即不能通过代码中的刷新“语句”将变量保存在本地 CPU 寄存器中。
缓存一致性确保如果一个 CPU 从/向内存执行读取或写入指令,则系统中的所有其他 CPU 在访问该内存地址时将从该内存地址获得相同的值。所有缓存都将显示一致的值。但是,在 OpenMP 标准中必须有一种方法来指示编译器实际插入读/写机器指令而不是推迟它。在为循环生成高效的机器语言代码时,将变量保存在循环中的寄存器中是很常见的。
如果您使用的是具有非一致缓存的机器,则您可能在超级计算机构工作,应该咨询熟悉您的架构和工具集的当地专家。
【讨论】: