双插槽与单插槽内存模型?
Posted
技术标签:
【中文标题】双插槽与单插槽内存模型?【英文标题】:Dual socket vs single socket memory model? 【发布时间】:2013-03-22 04:50:02 【问题描述】:从在 Linux 上运行的 C/C++ 程序的角度来看,双 CPU 机器中的内存是什么样子有点困惑。
案例 1(已理解)
使用一个四核 HT CPU、32GB RAM,理论上我可以编写一个单进程应用程序,使用多达 8 个线程和多达 32GB RAM,而不会进入交换或超载线程设施 - 为了简单起见,我在这里忽略了操作系统和其他进程。
案例 2(混淆)
设置了 64GB RAM 的双四核 HT CPU 会发生什么?
在开发方面,您需要编写一个应用程序以作为两个进程(8 个线程,每个 32GB)进行通信,还是可以将其编写为一个进程(16 个线程,64GB 完整内存)?
如果答案是前者,那么有哪些有效的现代策略来利用整个硬件?嘘?工控机?另外,如何指导 Linux 为每个进程使用不同的 CPU?
【问题讨论】:
有很多方法可以做到这一点。一种方法是使用两个处理器并固定它们。然后使用IPC。另一种方法是将其视为单个共享内存机器,要么吃掉 NUMA 开销,要么玩弄内存分配和亲和力来挤出最后一滴。 从应用的角度来看,双四核机器是八核(即16个处理器线程)机器。但是,时间和延迟可能会有所不同。 【参考方案1】:从应用程序的角度来看,物理 CPU(裸片)的数量并不重要。只有虚拟处理器的数量。这些包括所有处理器上的所有内核,如果在内核上启用了超线程,则加倍。以相同的方式在它们上安排线程。核心是全部在一个芯片上还是分布在多个芯片上都没有关系。
一般来说,处理这些事情的最佳方式是不。不要担心在哪个核心上运行什么。只需为您的应用程序生成适当数量的线程(理论上最大值等于系统中的内核总数),然后让操作系统处理调度。
当然,内存在系统中的所有内核之间共享。但同样,由操作系统来处理物理内存的分配。很少有应用程序真正需要担心它们使用了多少内存,以及在线程之间分配内存。让操作系统来处理。
【讨论】:
好的——这就是线程部分——内存呢?我可以在一个进程中访问全部 64GB(16 个线程)吗?两个 CPU 都可以访问完整的 RAM? @kfmfe04 是的,两个 CPU 都可以访问完整的 RAM。即便如此,性能也不会。 (NUMA) 但他们可以访问彼此的内存。 @Mysticial - 有趣:然后我可以使用 64GB(16 个线程)做一个进程的简单模型然后......我不知道这个:想到双 CPU,每个CPU 只能访问其单独的内存组。 @kfmfe04 作为应用程序程序员,您很少担心这些细节。这些都是系统级别的细节。 顺便说一句,将我带到 *** 的问题是 question on dual-socket NUMA。 :)【参考方案2】:内存模型**与内核数量本身无关**,而是与多核计算机上采用的架构有关。大多数主流计算机使用对称多处理模型,其中单个操作系统控制所有 CPU,并且在这些 CPU 上运行的程序可以访问所有可用内存。每个 CPU 都有私有内存(缓存),但 RAM 都是共享的。因此,如果您有 64 位机器,那么无论您编写 1 个进程还是两个进程,就内存使用的影响而言,这都会有所不同。明智地编程,您最好使用单个进程。
正如其他人指出的那样,您确实需要担心线程关联等问题,但这更多地与 CPU 资源的有效使用有关,而与 RAM 的使用关系不大。不过,缓存使用会产生一些影响。
与其他内存模型计算机相比,例如 NUMA(非统一内存访问),其中每个 CPU 都有自己的内存块,然后跨 CPU 通信需要一些仲裁器。在这些计算机上,您需要担心在内存方面将线程放置在哪里。
【讨论】:
以上是关于双插槽与单插槽内存模型?的主要内容,如果未能解决你的问题,请参考以下文章