【发布时间】:2011-09-14 06:32:41
【问题描述】:
虽然我已经阅读了有关此的 movntdqa 指令,但已经找到了一种干净的方法来表达不可缓存的内存范围或读取数据,以免污染缓存。 我想从 gcc 做到这一点。我的主要目标是交换到大数组中的随机位置。由于数据很少,因此希望通过避免缓存来加速此操作。
【问题讨论】:
-
在 Windows 上肯定有办法做到这一点。不过,我不确定 Linux 上的 GCC。但是,我不确定您是否要将读取内存声明为不可缓存。尽管您不会污染缓存,但您(可能)会为每次访问支付全部内存延迟。
-
我同意它可能不会提高性能。但我很高兴知道如何使用此功能。
-
没有办法禁用cpu缓存。你也不会想要,它会让它变得非常缓慢。未缓存的内存读取很容易花费一百多个周期。
-
@Hans Passant:你的第一句话是错误的——例如在 x86 架构上,您可以通过在 CR3 寄存器中设置 PCD 位来完全禁用缓存,或者通过为特定页面设置 PCD 位来仅针对某些页面禁用缓存。至于第二个说法,Sandeep 描述了一种缓存可能真的没用的情况——虽然它可能不会加快主应用程序的速度,但它可以为其他线程节省宝贵的缓存。
-
@HansPassant 当然可以禁用缓存。您可以为此使用 MTRR,或为此使用页面属性表。