如何在单个线程/内核上实现并行性



现代编程语言为用户提供并行性和并发性机制作为一等公民。我了解并行算法是如何编程的,并且可以很好地想象多核CPU上的两个线程如何并行运行。

然而,这些平台中的大多数还支持在单个线程上运行并行进程。

  • 这些进程真的并行运行吗?
  • 在程序集级别上,如何在单个线程上同时执行两个不同的例程?

TLTR; :在单个非超线程CPU内核上的并行性(在真正的同时执行的意义上)是不可能的。


硬件(<-编辑)平行主义可以在几个级别上实现。按粒度递减排序:

  1. 多主机
  2. 多处理器
  3. 多核
  4. 多线程("超线程",即"HT")(编辑:我自愿省略了矢量化计算的情况,其中多个ALU可以由同一核心驱动

您的问题与在案例 3 中运行两个软件线程有关。(如果 HT 不可用/禁用)或 4。

  • 在这两种情况下,进程实际上都不是并行运行的。由于在 CPU 级别执行的极快上下文切换,用户具有同时性的印象,这些上下文切换倾向于按顺序将物理内核(或线程)时间分配给一个或另一个软件线程

  • 在这两种情况下,这些例程根本不是同时执行的,而是按顺序执行

  • 的。

分配给这两个例程中每个例程的相对优先级可以通过您赋予进程的"优先级"在各种操作系统上设置,该优先级将由操作系统的调度程序处理,而调度程序又将分配 CPU 时间。

呵。

为了执行测试以更好地理解此主题,您可能需要谷歌"cpu 亲和力"。这将允许您在多核 CPU 的一个物理单核上运行双线程进程,并计算每个线程所花费的时间,同时修改它们的优先级等......

是的,每个线程都有并行性,无论您使用哪种编程语言,您都可以免费获得它(尽管并行性的数量可能会有所不同)。

它称为指令级并行性。细节相当复杂,在不同的处理器微架构之间有所不同。

《计算机体系结构:定量方法》是一本精彩的书,其中有一章是关于指令级并行性的,这本书的例子教我们如何理性地思考工程。

有关详细信息,请查看以下链接:

http://en.wikipedia.org/wiki/Superscalar

http://en.wikipedia.org/wiki/Instruction_pipelining

http://en.wikipedia.org/wiki/Out-of-order_execution

最新更新