【问题标题】:How is parallelism on a single thread/core possible?单线程/内核上的并行性如何可能?
【发布时间】:2012-05-01 23:40:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: language-agnostic parallel-processing computer-science


    【解决方案1】:

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


    硬件 (

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

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

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

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

    分配给这 2 个例程中的每一个例程的相对优先级可以通过您赋予进程的“优先级”在不同的操作系统上设置,这将由操作系统的调度程序处理,进而分配 CPU 时间。

    HTH。

    要执行测试以更好地理解该主题,您可能需要在 Google 上搜索“cpu affinity”。这将让您在多核 CPU 的一个物理单核上运行一个双线程进程,并计算每个线程所花费的时间,同时修改它们的优先级等...

    【讨论】:

    • (4) 混合了两种不同的东西。 HT 是允许在两个线程之间快速切换的硬件支持(因此,如果一个线程正在等待内存中的数据,另一个线程可以接管)。还有(5)是软件级别的“简单”线程。 4 和 5 都不是“真正的”线程,其中操作并行发生,但 (4) 变得更接近,因为某些操作(或部分操作)可能与另一个超线程并行发生。例如,一个超线程的内存获取可能会在另一个超线程运行时发生。
    • @adrew cooke:感谢您完善列表。我故意没有将 (5) 包含在列表中,因为它是“软件”并行性,所以你是对的(我正在修改最初的帖子):我只列出了“硬件”并行性类型。
    • -1:所有现代 CPU 都在指令级提供并行性。看我的回答。
    • @JørgenFogh:超标量/矢量 CPU 是特殊类型的 CPU。您所说的与我的论点并不矛盾,这与“单个非超线程 CPU 内核”有关。如果您希望我可以添加“非矢量化、非超标量”:)
    • 您在技术上是正确的。然而,多年来,所有 CPU 至少在指令级具有一定的并行性。大多数程序员并不是针对 70 年代的机器。
    【解决方案2】:

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

    它叫做instruction-level parallelism。细节相当复杂,并且在不同的处理器微架构之间存在差异。

    Computer Architecture: A Quantitative Approach 是一本很棒的书,其中包括关于指令级并行性的一章,书中的示例教授了如何理性地思考工程。

    查看以下链接了解更多信息:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      相关资源
      最近更新 更多