10

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

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

  • 这些过程真的并行运行吗?
  • 在汇编级别上,如何在单个线程上同时执行两个不同的例程?
4

2 回答 2

9

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


硬件(<- EDIT) 可以在多个级别上实现并行。按粒度递减排序:

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

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

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

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

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

HTH。

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

于 2012-04-20T11:36:34.203 回答
2

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

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

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

于 2013-05-12T19:04:03.557 回答