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