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