为什么不混合无序,大规模并行?

时间:2011-04-20 23:44:02

标签: cpu multicore computer-architecture parallel-processing

似乎很流行地预测超标量无序CPU正在走向渡渡鸟的方式,并将被大量简单,标量,有序核心所取代。这似乎并没有在实践中发生,因为即使明天解决了并行化软件的问题,仍然有大量的遗留软件。此外,并行化软件不是一个小问题。

我知道GPGPU是一种混合模式,其中CPU设计用于单线程性能,而图形卡用于并行,但它是一个丑陋的模型。程序员需要明确地重写代码以在显卡上运行,并且据我所知,有效地为显卡表达并行性要比为多核通用CPU有效地表达它更加困难。

混合模式出了什么问题,每台PC配备一个或两个“昂贵的”超标量无序内核和32或64个“廉价”内核,但指令集与昂贵的内核相同,可能在同一块硅?操作系统将意识到这种不对称性,并将首先调度无序核心并使用最高优先级线程。这种优先级甚至可能通过OS API明确地暴露给程序员,但程序员不会被迫关心区别,除非他/她想控制调度的细节。

编辑:如果投票结束是因为这可能与编程不相关,这是一个反驳:我认为它与编程有关,因为我想听听程序员对于为什么这样一个模型是好的或坏的想法的观点以及他们是否想要编程。

5 个答案:

答案 0 :(得分:2)

W00t,这是一个很棒的问题= D

一眼就能看出两个问题。我建议你,现在我在考虑暴露我的论点时会考虑一个CPU有界并行应用程序。

第一个是对操作系统施加的控制开销。请记住,操作系统负责将进程分派给它们将运行的CPU。此外,OS需要控制对保存此信息的数据结构的并发访问。因此,您获得了操作系统抽象任务计划的第一个瓶颈。这已经是一个缺点。

以下是一个不错的实验。尝试编写一个充分利用CPU的应用程序。然后,使用其他一些应用程序,如atsar,获取用户和系统时间的静态。现在,改变并发线程的数量并查看系统时间会发生什么。绘制数据可能有助于计算(不是那么)无用处理的增长。

其次,在向系统添加内核时,还需要更强大的总线。 CPU内核需要与内存交换数据,因此可以进行计算。因此,使用更多内核,您将有更多的并发访问总线。有人可能会争辩说可以设计一个具有多个总线的系统。是的,的确,可以设计这样的系统。但是,必须有额外的机制来保持核心使用的数据的完整性。某些机制确实存在于缓存级别,但是它们在主内存级别部署非常昂贵。

请记住,每次线程更改内存中的某些数据时,此更改必须在访问此数据时传播到其他线程,这是并行应用程序中常见的操作(主要是数字中的操作)。

尽管如此,我同意你的观点,即目前的模特很难看。是的,现在在GPGPU编程模型中表达并行性要困难得多,因为程序员完全负责移动位。我非常希望为多核和GPGPU应用程序开发提供更简洁,高级和标准化的抽象。

答案 1 :(得分:2)

@aikigaeshi感谢您提及我的论文。我是Yale Patt的学生,实际上是题为加速关键部分的论文的第一作者。经过大量的研究,我们提出了这个想法。事实上,我最近在一次行业会议上就此发表了重要讲话。经过几年的研究,这是我的看法:

@dsimcha,这个问题应该分成两部分进行分析。

  1. 我们是否需要能够比其他代码更快地运行某些代码?这个问题导致了一个更简单的问题:一些代码比其他代码更重要。我将关键代码定义为线程内容的任何代码。当一个线程争用一堆代码来完成执行时,线程正在等待的代码显然变得更加关键,因为加速该代码不仅加速了当前执行代码的线程,而且加速了等待当前线程的线程完成执行。单线程内核是一个很好的例子,所有线程都在等待单个线程完成。关键部分是另一个示例,其中所有想要进入临界区的线程必须等待任何先前的线程完成关键部分。更快地运行这样的关键代码显然是一个好主意,因为当代码被争用时,它本身就变得对性能更为关键。还有其他一些场景,如减少,负载不平衡,线程问题,可以导致关键代码,更快地执行此代码可以提供帮助。因此,我强烈得出结论,需要我称之为性能不对称。

  2. 我们如何提供性能不对称?在同一系统中将大核和小核组合在一起是提供这种不对称性的一种方式。虽然这是我探索的架构,但在探索提供不对称的其他方法时应该做很多研究。频率调整,优先处理来自关键线程的内存请求,为关键线程提供更多资源,都是提供不对称性的可能方式。回到大小核心架构:我的研究发现在大多数情况下它是可行的,因为将任务迁移到大核心的开销被加速关键代码所获得的好处所抵消。我会跳过细节,但有一些非常有趣的权衡。我鼓励你阅读我的论文或博士论文的细节。

  3. 我还想指出一些重要事实。 - 我能够利用这种非对称芯片(ACMP)而无需修改软件程序,因此可以证明它不会增加应用程序员的工作量 - 我没有发现操作系统工作具有挑战性。我在几周内自己实现了一个运行时间,这对我的学习很有帮助。我理解他在Os社区中担心改变操作系统,我很欣赏工程资源的价值,但是,我不同意操作系统的改变应该是一个限制因素。它的问题将随着时间的推移而克服。

    - 在编写并行程序,研究现有程序,研究处理器设计以及在大公司工作的一年后,我实际上确信ACMP实际上将帮助程序员。在当前的模型中,程序员编写一个并行程序,然后确定串行瓶颈,然后锤击它直到它并行化,然后继续下一个瓶颈。总的来说,瓶颈变得越来越难以解决并且收益越来越少。如果硬件提供了一些能够更快地运行瓶颈的能力 - 那么程序员就不必浪费那么多时间来获得并行性能。他们可以并行化更易于并行化的代码,并将其余代码留在硬件上。

答案 2 :(得分:1)

你的帖子更像是一个假设,而不是一个探究。该主题称为异构架构,目前是一个生动的研究领域。您可以在行业会议上找到关于异构策略的有趣研讨会和主题演讲。

http://scholar.google.com/scholar?q=heterogeneous+architectures&hl=en&btnG=Search&as_sdt=1%2C5&as_sdtp=on

  

混合模型出了什么问题   每台PC都配有一两个   “昂贵的”超标量无序   核心和32或64“廉价”核心,但   与指令集相同   昂贵的核心,可能在   同一片硅?

它没有任何“错误”,但存在许多实际困难。例如,您提到按线程优先级进行调度,但这只是制定智能调度决策所需的众多指标之一。如果您的最高优先级线程是一个数据流应用程序,使得大型核心缓存的使用非常差,该怎么办?您的网络系统性能是否会增加,以便在小核心上安排此流媒体应用程序?

答案 3 :(得分:1)

你的想法听起来很像AMD的Fusion计划。 AMD正在将GPU集成到CPU中。目前,这是因为他们的低功耗慢速设计旨在取代英特尔的Atom,但他们正在将其转移到笔记本电脑芯片中。

我相信谣言非常可靠,AMD的Bulldozer服务器芯片设计将在几年内使用Fusion,可能完全取代Bulldozer浮点单元。

这些GPU单元没有使用相同的指令集,但考虑到内置于CPU中的GPU,编译器本身可以自由使用它,就像它是任何其他类型的MMX / SSE向量指令类型一样。

一个可能的例子是在浮点数的C ++向量上进行数学运算的循环。优化设置为AMD-Whatever的编译器可以编写机器代码来固定向量存储器,调用GPU程序并等待结果。

这比SSE的自动矢量化优化更复杂一点:它们将数据加载到XMM寄存器中,执行操作并将数据从寄存器中分离出来。

答案 4 :(得分:1)

许多大型架构人员实际上都同意你的看法,异构架构显示了许多希望。前几天,Yale Patt我看到了他采取这一立场的演讲,他预测下一代成功的架构将由一些大型快速核心组成,并辅以许多较小的核心。一个小组使用这个想法通过提供一个更大的核心来实际减轻并发的开销,可以迁移critical sections中执行的线程。