Performance 访问同一内存的内核数量是否有实际限制?

Performance 访问同一内存的内核数量是否有实际限制?,performance,hardware,cpu,multicore,Performance,Hardware,Cpu,Multicore,当前向计算机添加内核的趋势还会继续吗?或者,对于一组内存所能提供的内核数量是否存在某种理论或实际限制 换句话说:未来的高性能台式计算机是倾向于使用一组内存拥有1024个内核,还是倾向于拥有32组内存,每个内存由32个内核访问 或者还有另一种方法:我有一个多线程程序,在4核机器上运行良好,占用了大量的总CPU。随着这个程序规模的扩大和工作量的增加,我是否有理由相信会有更强大的机器来运行它?或者我应该认真考虑在多台机器上运行多个会话(或者至少是多组内存)来完成工作吗 换句话说,纯粹的多线程设计方法会

当前向计算机添加内核的趋势还会继续吗?或者,对于一组内存所能提供的内核数量是否存在某种理论或实际限制

换句话说:未来的高性能台式计算机是倾向于使用一组内存拥有1024个内核,还是倾向于拥有32组内存,每个内存由32个内核访问

或者还有另一种方法:我有一个多线程程序,在4核机器上运行良好,占用了大量的总CPU。随着这个程序规模的扩大和工作量的增加,我是否有理由相信会有更强大的机器来运行它?或者我应该认真考虑在多台机器上运行多个会话(或者至少是多组内存)来完成工作吗

换句话说,纯粹的多线程设计方法会让我陷入死胡同吗?(就像使用单线程方法,并且取决于多年前CPU速度的持续提高一样?)该程序不太可能在成本超过3000美元的机器上运行。如果那台机器不能做这项工作,这项工作就做不成了。但是,如果那台3000美元的机器实际上是一个由32台独立计算机组成的网络(尽管它们可能共享同一个冷却风扇),并且我继续我的大规模多线程方法,那么这台机器将能够完成这项工作,但程序无法完成,我将处于一个尴尬的境地

分布式处理看起来比多线程更痛苦,但如果这可能发生在我的未来,我希望得到一些警告

当前向计算机添加内核的趋势还会继续吗

是的,比赛结束了。在目前的技术条件下,再提高速度是不现实的。物理学已经成为阻碍。制造芯片的技术可能会有一个戏剧性的转变,这使得我们能够绕过这个问题,但这显然不是“即将到来”

如果我们不能拥有更快的内核,那么获得更多功率的唯一方法就是拥有更多的内核

或者,对于一组内存所能提供的内核数量是否存在某种理论或实际限制

绝对是有限度的。在共享内存系统中,内存是一种共享资源,具有有限的带宽

Max processes = (Memory Bandwidth) / (Bandwidth required per process)
现在,缓存将降低“每个进程的带宽”这一数字,但是如果缓存必须彼此一致,那么缓存的效率就会降低,因为每个人都在访问相同的内存区域。(如果其他CPU可能需要您写入的内容,则无法缓存内存写入)

当您开始谈论大型系统时,像这样的共享资源成为主要问题。它可能是内存带宽、CPU周期、硬盘访问、网络带宽。它归结为整个系统的结构


你似乎真的在要求对未来有一个愿景,这样你才能做好准备。这是我的照片

我认为我们将看到软件开发人员在程序中看待并行性的方式发生变化。目前,我要说的是,许多软件开发人员认为使用多线程的唯一方法是让多个线程做相同的事情。问题是他们都在争夺同样的资源。这就意味着需要引入大量的锁定,这会导致性能问题和微妙的bug,而这些bug会让人恼火,需要花费大量的时间来解决

这是不可持续的

制造业在20世纪初开始发展,制造大量汽车的最快方法不是让很多人在一辆车上工作,然后,当那辆车完成后,把他们全部转移到下一辆车上。它将汽车制造过程分解为许多小的工作,一个工作的产出供给下一个工作。他们称之为装配线。在硬件设计中,它被称为管道内衬,我想我们会看到越来越多的软件设计转向它,因为它最大限度地减少了共享资源的问题

当然-在一个阶段的输出和下一个阶段的输入上仍然有一个共享资源,但是这只在两个线程/进程之间,更容易处理。关于如何制作这些接口,也可以采用标准方法,消息队列库似乎在这方面取得了很大进展

但并不是所有问题都有一个解决方案。这种类型的管道非常适用于可以吸收一些延迟的高吞吐量应用程序。如果你不能忍受延迟,你别无选择,只能走“一个任务上有许多工作人员”的路线。理想情况下,这些是您希望在SIMD机器/阵列处理器(如GPU)上使用的,但它只在某些类型的问题上表现出色。这些问题是指有大量数据需要以相同的方式处理,而数据项之间几乎没有依赖关系


掌握好消息队列技术和流水线系统的类似技术,并通过OpenCL等库利用GPU上的细粒度并行性,将使您对这两个方面都有深入的了解

更新:多线程代码可能会在集群计算机上运行,所以这个问题可能不像我想的那么严重

我仔细检查了JLS第17章中的Java内存模型,发现它没有反映大多数计算机的典型寄存器缓存主内存模型。多内存机器有机会将数据从一个内存干净地转移到另一个内存(以及从一台机器上运行的一个线程转移到另一台机器上运行的另一个线程)。所以我开始搜索可以在多台机器上运行的JVM。我找到了一些旧的参考资料——这个想法已经存在,但没有贯彻到底。然而,如果我没有看错他们的公关,一家名为Terracotta的公司似乎有一些东西

无论如何,当PC机通常包含多台集群计算机时,很可能会有一台mult