首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在x86平台上使用gcc将内存范围声明为不可缓存?

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

Stack Overflow用户
提问于 2011-09-14 06:32:41
回答 2查看 4.9K关注 0票数 10

虽然我已经阅读了有关movntdqa的说明,但已经想出了一种清晰的方法来表示内存范围、不可缓存或读取数据,这样就不会污染缓存。我想从gcc那里做这个。我的主要目标是切换到大数组中的随机位置。希望通过避免缓存来加速这一操作,因为很少有数据可重复使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-18 09:09:15

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

一个更好的方法是查看编译器的本质GCC 提供,并找到一个或多个表达您的意图。看看Ulrich关于“每个程序员都应该知道什么是关于内存的知识”的系列文章,特别是关于绕过缓存的第5部分。看起来,_mm_prefetch(ptr, _MM_HINT_NTA)可能适合您的需要。

与以往一样,当涉及到绩效时--衡量、衡量、衡量。Drepper系列的出色部分详细介绍了如何做到这一点(第7部分),以及在加快代码的内存性能时可以尝试的代码示例和其他策略。

票数 8
EN

Stack Overflow用户

发布于 2011-09-23 22:36:12

来自user786653的所有好建议;特别是Ulrich的文章。我将补充如下:

  • 无论是否未缓存,VM将不得不在TLB中查找页面信息,TLB的容量有限。不要低估TLB攻击对随机访问性能的影响。如果您还没有,请参阅这里的结果,以了解为什么您确实希望对数组数据使用大页,而不是使用微不足道的4K默认值(这可以追溯到“640 K应该对任何人都足够”的时代)。当然,如果您说的是非常大的数组,即使是一个装满2MB页面的TLB也无法引用,即使这样也于事无补。
  • 你对'nt‘指令有什么抵触(例如_mm_stream_ps内在的)?我不相信声明页面未被缓存会给您带来比适当使用这些页面更好的性能,而且它们比其他选项更容易使用。会很有兴趣看到相反的证据。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7412169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档