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

San*_*eep 10 x86 assembly gcc sse

虽然我已经阅读了关于movntdqa的相关说明,但已经找到了一种表达内存范围不可缓存或读取数据的简洁方法,以免污染缓存.我想从gcc做到这一点.我的主要目标是交换到大型阵列中的随机位置.希望通过避免缓存来加速此操作,因为数据恢复非常少.

use*_*653 7

我想你所描述的是存储器类型范围寄存器.你可以在Linux下控制这些(如果可用,你是用户0)使用/proc/mttr/ ioctl(2)参见这里的例子.由于它适用于物理地址范围,我认为您将很难以合理的方式使用它.

更好的方法是查看GCC 提供的编译器内在函数并找到一个或多个表达您意图的内容.看看Ulrich Drepper关于"每个程序员应该了解内存的内容"的系列文章,特别关于绕过缓存的第5部分.它看起来_mm_prefetch(ptr, _MM_HINT_NTA)可能适合您的需求.

与性能一样 - 测量,测量,测量.Drepper的系列具有优秀的部件,详细说明了如何完成(第7部分)以及代码示例和其他策略,以加快代码的内存性能.