gcc - 如何在x86平台上使用gcc将内存范围声明为不可缓存?

标签 gcc assembly x86 sse

尽管我已经阅读了有关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/

相关文章:

docker - 无法pecl在Docker alpine上安装:3.7

c++ - Placement-new 与 gcc 4.4.3 严格别名规则

c++ - 在 C++ 中观察汇编器中虚函数的后期绑定(bind)调用

c - 在汇编中解密二进制文件

assembly - 在 x86-64 CPU 上通过交叉修改代码重现意外行为

c - 链接C代码时如何判断符号的定义位置

关于 printf() long unsigned int 和 uint32_t 的编译器警告

assembly - AMD64 上的推送和弹出

c - 如何从汇编代码逆向工程C整数类型?

assembly - 用 LEA 指令减去寄存器?