微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std :: vector保留并调整NUMA位置的大小

如何解决std :: vector保留并调整NUMA位置的大小

我目前正在研究优化应用程序的NUMA位置。

到目前为止,我想我知道内存将驻留在分配后首次接触它的那个NUMA节点上。

关于std :: vector(使用认分配器)的问题是:

  • std :: vector :: reserve分配新的内存-但是它也会触及吗?如果没有,我如何在预约电话后强制触摸它?
  • std :: vector :: resize是否触及内存?
  • 采用size_t的构造函数如何?

关于NUMA:

  • 如果已被触摸的内存被调出到磁盘上,然后再次被访问并产生硬故障,则算作新的第一次触摸还是页面被加载到驻留在numa节点上的内存中原来是最早接触它的?

  • 我正在使用c ++ 11线程。只要我在线程内并分配/触摸新内存,就可以确定所有这些内存都将驻留在同一个numa节点上,或者操作系统执行时操作系统是否可以在线程下切换正在执行的cpu然后我的一些分配将在一个NUMA域中,而其他分配将在另一个域中?

解决方法

假设我们在谈论英特尔CPU:在它们的Nahlem老式CPU上,如果您有两个这样的CPU,则有一个上电选项来告诉他们如何在它们之间分配物理内存。物理体系结构是通过QPI连接的两个CPU,每个CPU控制自己的一组内存SIMM。选项是

  1. 一个CPU上物理地址空间的前一半,另一个CPU上的后一半,或者

  2. 在CPU之间替换内存页面

对于第一个选项,如果您分配了一块内存,它将落到操作系统上,它将从物理地址空间中获取该内存,然后我想一个好的调度程序将努力运行访问该内存的线程在控制它的CPU上。对于第二个选项,如果您分配了几页内存,那么将在两个物理CPU之间分配内存,那么调度程序对访问它的线程所做的操作并不重要。我实际上只是短暂地玩了一下,无法真正发现差异。英特尔在QPI方面做得很好。我对较新的英特尔架构不太熟悉,但是我认为它与以前的架构更多相同。

另一个问题实际上是NUMA节点是什么意思?如果我们指的是现代的Intel和AMD CPU,它们会为软件提供一个综合的SMP环境,并在NUMA硬件体系结构之上使用QPI / Hypertransport(以及现在的现代等效物)之类的东西来实现。因此,在谈论NUMA本地性时,实际上是OS调度程序是否在控制线程访问的RAM的CPU上的内核上运行线程(SMP意味着它可以在任何内核上运行,并且仍然可以存取,尽管可能会有微小的延迟差异,但是无论在物理内存中的分配位置如何,内存都可以访问)。我不知道答案,但我认为有些人会这样做。当然,我所做的将内核亲和力用于线程和内存的努力仅比让OS(Linux 2.6)做到这一点仅产生了微小的改进。而且,现代CPU上的缓存系统及其与CPU间互连(例如QPI)的交互非常聪明。

可追溯到SMP真正是纯硬件的较早的操作系统,SMP不知道这样做。

小兔子洞-如果我们指的是纯NUMA系统(Transputers,PS3及其SPE中的Cell处理器),则线程将在特定内核上运行,并且只能访问该内核的内存;为了访问(通过另一个线程)在另一个内核的内存中分配的数据,该软件必须通过在某些互连上发送数据来对自身进行分类。除非学习,否则很难编写代码,但是结果可能很快。英特尔花了大约10年的时间才能将Cell处理器与原始处理器相提并论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。