尽管我已经阅读了有关movntdqa的说明,但是已经找到了一种干净的方法来表示不可缓存的内存范围或读取数据,以免污染缓存。
我想从gcc做到这一点。我的主要目标是交换到大型阵列中的随机位置。希望通过避免缓存来加速此操作,因为几乎没有数据续存。
最佳答案
我认为您要描述的是Memory Type Range Registers。您可以使用/proc/mttr
/ioctl(2)
在Linux(如果可用,并且您是用户0)下控制这些文件,请参见here作为示例。由于它适用于物理地址范围,因此我认为您将很难以合理的方式使用它。
更好的方法是查看编译器的内在函数GCC provides,然后找到一个或多个表达您意图的函数。看一看Ulrich Drepper的“每个程序员应该了解的内存知识”系列,特别是part 5,它绕过缓存。看来_mm_prefetch(ptr, _MM_HINT_NTA)
可能适合您的需求。
与往常一样,在绩效方面-衡量,衡量,衡量。 Drepper的系列文章非常出色,详细介绍了如何完成此工作(part 7),以及代码示例和其他可提高代码的内存性能的策略。
关于gcc - 如何在x86平台上使用gcc将内存范围声明为不可缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412169/