Optimization 每个程序员都应该知道关于内存的什么?

Optimization 每个程序员都应该知道关于内存的什么?,optimization,memory,x86,cpu-architecture,cpu-cache,Optimization,Memory,X86,Cpu Architecture,Cpu Cache,我想知道2007年的Ulrich Drepper的有多少仍然有效。我也找不到比1.0更新的版本或勘误表 (在Ulrich Drepper自己的网站上也是PDF格式:)据我所知,Dreper的内容描述了关于内存的基本概念:CPU缓存如何工作,什么是物理和虚拟内存,以及Linux内核如何处理这些问题。在一些示例中可能有过时的API引用,但这并不重要;这不会影响基本概念的相关性 因此,任何描述基本事物的书或文章都不能被称为过时。“每个程序员应该知道的关于内存的知识”绝对值得一读,但是,我不认为它适合“

我想知道2007年的Ulrich Drepper的有多少仍然有效。我也找不到比1.0更新的版本或勘误表


(在Ulrich Drepper自己的网站上也是PDF格式:)

据我所知,Dreper的内容描述了关于内存的基本概念:CPU缓存如何工作,什么是物理和虚拟内存,以及Linux内核如何处理这些问题。在一些示例中可能有过时的API引用,但这并不重要;这不会影响基本概念的相关性


因此,任何描述基本事物的书或文章都不能被称为过时。“每个程序员应该知道的关于内存的知识”绝对值得一读,但是,我不认为它适合“每个程序员”。它更适合系统/嵌入式/内核人员。

从我的快速浏览来看,它看起来相当准确。需要注意的是,“集成”和“外部”内存控制器之间的区别部分。自从i7系列发布以来,Intel CPU都是集成的,AMD自AMD64芯片首次发布以来一直在使用集成内存控制器


自从写了这篇文章以来,没有多少变化,速度提高了,内存控制器变得更智能了(i7将延迟写入RAM,直到感觉要提交这些变化),但没有多少变化。至少软件开发人员不会在意

PDF格式的指南位于

它总体上仍然非常优秀,并受到强烈推荐(我和其他性能调优专家都这么认为)。如果Ulrich(或其他任何人)编写了2017年的更新,这会很酷,但这将需要大量工作(例如重新运行基准测试)。另请参阅中的其他x86性能调优和SSE/asm(和C/C++)优化链接。(Ulrich的文章不是针对x86的,但他的大部分(所有)基准测试都是在x86硬件上进行的。)

关于DRAM和缓存如何工作的底层硬件细节仍然适用。DDR4使用DDR1/DDR2(读/写突发)的描述。DDR3/4的改进并不是根本性的改变。另外,所有与arch无关的东西仍然普遍适用,例如AArch64/ARM32

有关内存/L3延迟对单线程带宽的影响的重要详细信息,请参见:
bandwidth=2MiB,使用2MiB对齐方式(例如,当
size%alignment!=0时,这不会强制执行愚蠢的ISO C++17要求失败)

默认情况下,2MiB对齐的匿名分配将使用hugepages。某些工作负载(例如,在分配大量资源后持续使用一段时间)可能受益于
echo defer+madvise>/sys/kernel/mm/transparent\u hugepage/defrag
让内核在需要时对物理内存进行碎片整理,而不是退回到4k页面。(见附件)。在进行大量分配(最好仍然使用2MiB对齐)后,使用
madvise(MADV_HUGEPAGE)
更强烈地鼓励内核立即停止并进行碎片整理。碎片整理=
总是
对于大多数工作负载来说过于激进,并且将花费比TLB未命中节省更多的时间来复制页面。(kcompactd.)

顺便说一句,英特尔和AMD称2M页面为“大页面”,而“大页面”仅用于1G页面。Linux使用“hugepage”处理所有大于标准大小的内容

(32位模式遗留(非PAE)页表的下一个最大大小只有4M页,只有具有更紧凑条目的2级页表。下一个最大大小应该是4G,但这是整个地址空间,以及“级别”翻译的标准是CR3控制寄存器,而不是页面目录项。IDK(如果这与Linux术语有关的话)


附录B:Oprofile:Linux
perf
已基本取代了
Oprofile
perf list
/
perf stat-e event1、event2…
提供了编程硬件性能计数器的大多数有用方法的名称

perf stat -etask-clock,context-switches,cpu-migrations,page-faults,cycles,\
branches,branch-misses,instructions,uops_issued.any,\
uops_executed.thread,idq_uops_not_delivered.core -r2 ./a.out
几年前,需要将事件名称转换为代码,但现在
perf
内置了该功能


有关使用它的一些示例,请参见。

是的,我真的不明白程序员为什么需要知道SRAM和DRAM在模拟级别上的工作方式——这对编写程序没有多大帮助。而那些真正需要这些知识的人,最好花时间阅读手册中关于实际时间安排的细节,等等。但是对于那些对硬件低级知识感兴趣的人来说呢?也许没有什么用处,但至少很有趣。现在的性能==内存性能,所以在任何高性能应用程序中,了解内存是最重要的。这使得论文对于任何涉及以下领域的人都至关重要:游戏开发、科学计算、金融、数据库、编译器、大型数据集处理、可视化、任何需要处理大量请求的事情。。。因此,是的,如果你在一个大部分时间都处于空闲状态的应用程序中工作,比如文本编辑器,那么在你需要快速查找单词、计算单词数、拼写检查之前,这篇论文是完全没有意思的。。。哦,等等。。。没关系,我本来想接受你们两个的。但是我对你的帖子投了更高的票。对于软件开发人员来说,最主要的变化可能是预回迁线程是个坏主意。CPU功能强大,可以运行2个带超线程的完整线程,并且具有更好的硬件预取。软件预取通常不那么重要,特别是对于顺序访问。请看我的答案。有人知道我是否可以在某个地方以mobi格式下载这篇文章,这样我就可以在kindle上轻松阅读了吗?“pdf”很难阅读,因为缩放/格式有问题。它不是mobi,但LWN将该论文作为一组更容易在手机/平板电脑上阅读的文章。第一个是非常有启发性的答案和指针!这显然值得更多的选票@彼得·科尔德斯在那里