什么是所有不同类型的并行性?

What are all the different types of parallelism?

我想更多地了解并行性,但我注意到那里有很多不同的术语,有些似乎意思相同,而另一些则有显着差异。那么,所有不同类型的并行性是什么,它们之间有何不同,是否有特定的应用程序或目的?
(为了更加集中,我希望得到一个答案,使所有与并行相关的术语都清晰明了,包括下面未列出的术语;每种不同类型之间的技术比较会很好,但可能会导致在这个问题变得离题 - 再一次,我真的不知道,因此问题)。

注:
这不是关于并发的问题,并且超出了 "simple" 问题:"what is parallelism?",尽管可能需要澄清定义。

首先,我注意到了parallelism and threading之间的区别,但以下术语之间的一些区别仍然令人困惑。

为了让我的问题更加清晰,这里列出了我发现的与并行性相关的术语:并行计算、并行处理、多线程、多处理、多核编程、超线程(英特尔)2, Simultaneous MultiThreading (SMT) 3, Switch-on-Event MultiThreading 3. (如果可能,也将不胜感激这些术语中每一个的定义或对定义的引用)。

我非常具体的问题:线程级并行、指令级并行和进程级并行之间有什么区别? (以及任何其他 x 级并行性)?

在多核处理器中,并行可以发生在单核内吗?这就是超线程吗?这是否需要一个单核,例如,两个可以并行使用的 ALU?

最后一个:除了一个发生在硬件而另一个发生在软件的明显区别之外,硬件并行与软件并行之间是否有区别?

相关资源:
- Process vs Thread,
- Parallelism on a GPU,
- Hyper-threading,
- Concurrency vs Parallelism,
- Hyper-threading and gaming.

问:

线程级并行、
指令级并行、
和进程级并行有什么区别?

虽然主题确实非常广泛,但我会尝试持有这种观点,即使冒着让许多反对者提出反对简化主题的风险(但 Whosebug 格式不能替代其他完整参考来源, 是吗?):


A:
主要区别在于什么/谁/如何
负责让事情在true-[PARALLEL]

中执行
  • 指令级并行 - ILP - 是最简单的情况,CPU-架构设计了 "hardwired" 这种特殊形式基于硬件的并行性。拥有具有 ILP4 的处理器(一次执行 4 条指令),或者拥有具有这种形式的并行指令执行的基于每条指令宽度的处理器,对于某些指令是 ILP2 而对于其他一些指令是 ILP1,再次由硅架构决定,什么可以确实在指令级别并行发生。进一步的细节可能会带来一些令人尴尬的惊喜,因为在某些情况下内存控制器通道可能会阻止 ILP 模式,其中 REG/MEMORY 微指令将不得不等待空闲通道来访问指示的内存。

  • 硬件线程 是下一级粒度。鉴于 CPU-core 被声明为支持两个硬件线程,这些是唯一的代码执行流,可以并行流动(如果没有 O/S 请求来实例化并调度另一个线程得到执行,映射到可用的 CPU-core 硬件线程之一)。从用户的角度来看,有 O/S 工具允许人们显式地 "nail"-down 进程级 PID / 线程级 PID 亲和力到特定的 CPU-core( s) 从而限制甚至消除任何 "disturbance",以便从 "just"-[CONCURRENT] flow of code-execution closer to a true-[PARALLEL] 移动。

我们将故意跳过所有线程群,它们只是延迟屏蔽的工具(无论是在 SIMT / SMX warp-wide GPU 调度程序上,还是更宽松的 MIMT O/S -内核驱动的多线程)


- MIMT: 多指令多线程,一种不受限制的线程执行结构/策略,其中任何线程都可以并且确实会发出不同的指令执行的处理器,与 SIMT
相反 - SIMT: 单指令多线程,通常是 GPU 流式多处理器代码执行架构
- SMX:流式多处理器执行单元,通常是一个 GPU SIMT 构建块,根据 WARP 范围内的 SIMT 代码调度程序协调

what is the difference between thread-level parallelism, instruction-level parallelism, and process-level parallelism?

在1中,不同的CPU核执行不同的指令流。

在2中,单个CPU核心并行执行来自单个指令流的不同指令(这些指令要么是流中的连续指令,要么彼此非常接近)。

3 与 1 相同,区别在于外观。它只是关于哪些内存页面在线程之间共享而哪些不共享的默认设置。但是这些设置是用户可以通过进程创建标志、共享内存部分、动态库和其他系统 API 进行调整的,这就是为什么在较低级别上,进程和线程之间的区别不是什么大问题。

and any other x-level parallelism

另一个重要的是 SIMD 级并行性。对于这个,CPU 将相同的指令应用于存储在特殊宽寄存器中的多个操作数。使用 SSE,我们有 128 位宽的寄存器,我们可以,例如将一个寄存器中的 4 个单精度浮点数向量乘以另一个寄存器中的另外 4 个值,使用一条 mulps 指令并行生成 4 个乘积。 ARM NEON类似,也是128位寄存器,4个浮点数乘以4个浮点数的指令是vmul.f32。 AVX 在 256 位寄存器上运行,因此它可以使用一条 vmulps 指令一次乘以 8 个浮点数。

can parallelism occur within a single core?

是的。

Is that what Hyper-threading is

是的,这也是指令级并行,SIMD 并行也是如此。

does that require a single core having, for example, two ALU's that can be used in parallel?

现代 CPUs 每个核心有两个以上,但 HT 是在 P4 中引入的,这不是必需的。 HT 的好处不仅仅是加载多个 ALU,它还在线程等待数据从缓存或系统 RAM 到达时使用内核。而且,由于附近指令之间的数据依赖性,在内核停滞时使用内核。 HT 允许 CPU 内核在等待时在另一个硬件线程上计算其他内容,从而提高 ALU 利用率。如果没有 HT,内核可能会在 RAM 延迟的情况下等待数百个周期,或者在数据依赖性延迟的情况下等待数十个周期。

is there a difference between hardware vs software parallelism

当您有一个硬件线程和多个 OS 计算内容的线程时,在任何给定时间只有 1 个线程 运行。其余线程将等待。 OS 将定期(通常为 ~50-100Hz)切换哪个 运行,目的是为所有线程提供公平的 CPU 时间。如果你愿意,你可以称之为软件并行,但我根本不会称之为并行。