现代X86 CPU具有比旧版4K(即2MB或4MB)支持更大的页面大小的能力,并且有OS设施(Linux, 视窗)访问此功能。

上面的Microsoft链接指出,大页面“提高了翻译缓冲区的效率,这可以提高经常访问的内存的性能”。这对预测大页面是否会改善任何给定情况并不有帮助。我对混凝土感兴趣,最好是量化的示例,说明了将某些程序逻辑(或整个应用程序)移动到使用大量页面的地方,从而导致了一些性能的改进。有人有成功的故事吗?

我知道有一个特殊情况 : :使用庞大的页面可以 急剧 减少分支大型过程所需的时间(大概是因为需要复制的TLB记录数量减少了1000个订单的一个因素)。我对大型页面在不太异国情调的情况下是否也有好处。

有帮助吗?

解决方案 2

我试图构成一些代码,这些代码将用4K页面最大化TLB的打击,以检查大页面的收益。下面的东西运行 2.6倍更快 (比4K页)当Libhugetlbfs的Malloc(Intel I7,64bit Debian Lenny)提供了2mbyte页面时;希望有什么明显 scoped_timerrandom0n 做。

  volatile char force_result;

  const size_t mb=512;
  const size_t stride=4096;
  std::vector<char> src(mb<<20,0xff);
  std::vector<size_t> idx;
  for (size_t i=0;i<src.size();i+=stride) idx.push_back(i);
  random0n r0n(/*seed=*/23);
  std::random_shuffle(idx.begin(),idx.end(),r0n);

  {
    scoped_timer t
      ("TLB thrash random",mb/static_cast<float>(stride),"MegaAccess");
    char hash=0;
    for (size_t i=0;i<idx.size();++i) 
      hash=(hash^src[idx[i]]);
    force_result=hash;
  }

简单的“直线”版本与 hash=hash^src[i] 仅从大书中获得16%,但(狂野的猜测)英特尔 花哨的预取硬件 当访问可预测时可能会帮助4K案例(我想我可以 禁用预取 调查这是否是真的)。

其他提示

当您进行广泛间隔的随机访问到大型内存时,性能的最大差异将出现 - “大”意味着比TLBS中所有小页条目可以映射的范围要大得多(通常在现代处理器中具有多个级别)。

为了使事情变得更复杂,4KB页面的TLB条目数通常大于2MB页面的条目数量,但这因处理器而变化很大。 2级TLB中有多少个“大页面”条目也有很多变化。

例如,在AMD Opteron家族10H修订版D(“伊斯坦布尔”)系统中,CPUID报告:

  • L1 DTLB:4KB页面:48个条目; 2MB页面:48个条目; 1GB页面:48个条目
  • L2 TLB:4KB页面:512个条目; 2MB页面:128个条目; 1GB页:16个条目

CPUID报告说,在Intel Xeon 56xx(“ Westmere”)系统时:

  • L1 DTLB:4KB页面:64个条目; 2MB页面:32个条目
  • L2 TLB:4KB页面:512个条目; 2MB页:无

两者都可以在遭受2级TLB失误之前使用小页面绘制2MB(512*4KB),而Westmere系统可以使用其32 2MB TLB条目映射64MB,并且AMD系统可以使用其L1和L2中的176 2MB TLB映射352MB TLB。两种系统都将通过大于2MB且小于64MB的内存范围进行随机访问来获得显着的加速。 AMD系统应继续使用大型内存范围的大页面表现出良好的性能。

在所有这些情况下,您要避免的是最坏的情况(注1),即穿越X86_64层次层次地址翻译的所有四个级别。
如果没有一个地址翻译缓存机制(注2)工作,则需要:

  • 5次旅行到内存,加载在4KB页面上映射的数据,
  • 4个旅行到内存,加载在2MB页面上映射的数据,以及
  • 3次旅行到内存,加载在1GB页面上映射的数据。

在每种情况下,记忆的最后一次旅行是获取请求的数据,而其他旅行则需要获取页面翻译信息的各个部分。我看到的最好的描述是在AMD的“ AMD64 Architecture程序员手册2:系统编程”的第5.3节中(出版物24593) http://support.amd.com/us/embedded_techdocs/24593.pdf

注1:上面的数字并不是 最糟糕的 案子。在虚拟机下运行会使这些数字更糟。在导致内存的环境中运行,将页面表的各个级别交换为磁盘,使性能 很多 更差。

注2:不幸的是,即使知道这种细节级别也是不够的,因为所有现代处理器都有针对页面翻译层次结构的上层级别的其他缓存。据我所知,在公共场合记录了这些记录。

我已经看到一些HPC/网格方案的进步 - 特别是物理软件包,在带有大量RAM的机器上具有非常非常大的型号。同样,运行模型的过程也是机器上唯一活动的东西。我怀疑尽管没有测量,但某些DB功能(例如大量进口)也将受益。

就我个人而言,我认为,除非您对内存访问配置文件进行了很好的配置/理解,并且它可以进行大量的内存访问,否则您不太可能看到任何重大改进。

这变得深奥,但是巨大的TLB页面在进行DMA内存传输时(通过PCIE从主机到PHI)在Intel Xeon Phi(MIC)体系结构上产生了重大影响。 此英特尔链接描述了如何启用大型页面. 。我发现,DMA转移尺寸的增加超过8 MB,而正常的TLB页面大小(4K)开始降低性能,一旦转移尺寸达到512 MB,TLB页面大小(4K)从约3 GB/s降至1 GB/s以下。

在启用大型TLB页面(2MB)之后,对于512 MB的DMA传输,数据速率继续增加到5 GB/s。

我在运行大进程的服务器上获得了约5%的速度(> = 64GB)。例如,对于16GB Java过程,即4M x 4KB页面,但只有4K x 4MB页面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top