我试图更多地了解并行性,但我注意到有很多不同的术语,有些似乎意味着相同的事情,而其他人有一个显着的差异。那么,所有不同类型的并行性是什么,它们如何彼此不同,是否有任何特定的应用或目的? (为了使这一点更加集中,我希望得到一个答案,提供与并行性相关的所有术语的清晰度,包括下面未列出的术语;每种不同类型之间的技术比较会很好,但可能会导致这个问题失效-topic - 然后,我真的不知道,因此问题)。
注意: 这不是关于并发性的问题,而是超越了“简单”问题:“什么是并行性?”,尽管澄清定义可能是有道理的。
首先,我注意到parallelism and threading之间的区别,但下列术语之间的一些差异仍然令人困惑。
为了清楚我的问题,这里列出了我发现的与并行性有关的术语:并行计算,并行处理,多线程,多处理,多核编程,超线程(Intel)2,同时多线程(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。
虽然主题确实非常广泛,但我会尝试采用这种观点,即使有可能让许多反对者提出简化主题的反对意见(但StackOverflow格式并不能替代完整参考的其他来源,是吗?) :
[PARALLEL]
执行的事情[CONCURRENT]
代码执行流程更接近true-[PARALLEL]
one。我们将故意跳过所有线程群,这只是延迟屏蔽的工具(无论是在SIMT / SMX warp-wide GPU调度程序上,还是更轻松的,MIMT O / S内核驱动的多线程)
[PARALLEL]
系统处于编排的最高级别,其中硅(如InMOS网状的Transputers网络)和编程语言(如InMOS'occam
或occam-pi
)提供精心设计的,概念上制作的true-[PARALLEL]
代码-执行。- MIMT:多指令多线程,一种不受限制的线程执行结构/策略,其中任何线程可以并且确实向处理器发出不同的指令以执行,而不是SIMT - SIMT:单指令多线程,通常是GPU流多处理器代码执行架构 - SMX:流式多处理器执行单元,通常是GPU SIMT构建块,根据WARP范围的SIMT代码调度程序,GPU内核代码单元可以被定向(寻址)以进行TaskQueeue调度并稍后执行
线程级并行,指令级并行和进程级并行之间有什么区别?
在1中,不同的CPU核心执行不同的指令流。
在2中,单CPU核心并行地从单个指令流执行不同的指令(这些指令是流中的连续指令,或者彼此非常接近)。
3与1相同,不同之处在于美观。它只是关于哪些内存页面在线程之间共享的默认设置,哪些不是。但是这些设置可由用户调整,包括进程创建标志,共享内存部分,动态库和其他系统API,这就是为什么在较低级别上,进程和线程之间的差异并不是什么大问题。
和任何其他x级并行
另一个重要的是SIMD级并行。对于这个,CPU将相同的指令应用于存储在特殊宽寄存器中的多个操作数。对于SSE,我们有128位宽的寄存器,我们可以例如将一个寄存器中的4个单精度浮点数的向量乘以另一个寄存器中的另外4个值,使用单个mulps
指令并行生成4个乘积。 ARM NEON类似,也是128位寄存器,将4个浮点乘以4个浮点数的指令是vmul.f32
。 AVX在256位寄存器上运行,因此它可以使用单个vmulps
指令一次乘以8个浮点数。
并行性可以在单个核心内发生吗?
是。
这是超线程是什么
是的,它也是指令级并行性,也是SIMD并行性。
这是否需要一个单核,例如,两个可以并行使用的ALU?
现代CPU每个核心有两个以上但HT在P4中引入并不是必需的。 HT的利润不只是加载多个ALU,它还使用核心,而线程正在等待数据从缓存或系统RAM到达。而且,由于附近指令之间的数据依赖性,在核心停止时使用核心。 HT允许CPU核心在等待时在另一个硬件线程上计算其他内容,从而提高ALU利用率。如果没有HT,核心可能会在RAM延迟的情况下等待数百个周期,或者在数据依赖性延迟的情况下等待数十个周期。
硬件和软件并行性之间有区别吗?
如果您有一个硬件线程和多个计算内容的OS线程,则在任何给定时间只会运行一个线程。其余的线程将等待。操作系统将定期(通常~50-100Hz)切换哪一个正在运行,目标是为所有线程提供相当一部分CPU时间。如果你愿意,你可以调用该软件的并行性,但我不会把这种事情称为并行。