并行编程等于多线程编程吗?

45

并行编程等同于多线程编程吗?


1
可能重复 --> https://dev59.com/B0jSa4cB1Zd3GeqPD0FN - Bhaskar
3个回答

33

多线程编程是并行的,但并行编程不一定是多线程的。

除非多线程发生在单核心上,否则它只是并发的。


3
据我所知,在单核处理器上,线程不是并行的,它是并发的,但不是并行的。 - Ionuț G. Stan
@Ionut:http://thesaurus.reference.com/browse/concurrent <- 如果您查看第一个结果下的“同义词”标题。 - Lucas Lindström
6
我区分并发和并行的区别是, 并行是真正同时进行的,而并发只是看起来像同时进行。线程之间的切换非常快,以至于看起来像是并行,但其实不是。也许还有其他术语表示这一点,但这就是我的理解。 - Ionuț G. Stan
@LucasLindström:不,"parallel"在计算机科学的上下文中有特殊的含义,你提供的链接是误导性的。 - Kindred
这个答案也是误导性的。多线程仅意味着并发,而不是并行。换句话说,你可以在单核处理器上使用多线程。 - Sam Johnson

28

并不是必须要用多线程编程。可以在多个进程和甚至多台机器之间分配工作 - 尽管每个进程可能只使用一个线程,但我不认为这算是“多线程”编程,但它肯定是并行编程。当然,您可以争辩说,通过多个进程,整个系统中有多个线程...

最终,这样的定义只有在特定上下文中才有用。在您的特定情况下,这会有什么区别吗?或者这只是出于兴趣?


1
我们是否应该将SIMD视为并行编程?我们正在同时对多个数据执行相同的操作,但我不知道这是否被认为是太微小的并行化,以至于不能包含在并行编程的定义中。 - Mr. Boy
我认为SIMD更多是并行硬件设计,但在某种程度上,您必须考虑具有专用并行硬件的编程方面,例如针对GPU的编程怎么样? - jk.

26

不,多线程编程是指您有一个单一的进程,该进程生成一组线程。所有线程同时运行,但它们都在同一个进程空间下:它们可以访问相同的内存,具有相同的打开文件描述符等。

并行编程作为一种定义要更“通用”一些。在MPI中,通过多次运行相同的进程来执行并行编程,不同之处在于每个进程得到不同的“标识符”,因此如果需要,可以区分每个进程,但这不是必需的。此外,这些进程相互独立,并且它们必须通过管道或网络/Unix套接字进行通信。MPI库提供特定的函数以同步或异步方式在节点之间移动数据。

相比之下,OpenMP通过多线程和共享内存实现并行化。您可以向编译器指定特殊的指令,它会自动为您执行并行执行。

OpenMP的优点在于它非常透明。需要并行化循环吗?只需添加几个指令,编译器就会将其分块,并将每个循环片段分配给不同的处理器。不幸的是,对于这种情况,需要一个共享内存架构。基于节点的体系结构的集群无法在集群级别使用OpenMP。MPI允许您在基于节点的架构上工作,但您必须付出更复杂和不透明的代价。


哦,这意味着一个作业由n个进程处理,而不是一个作业由n个线程处理。 - Eko Kurniawan Khannedy
我记得正在针对多进程架构进行类似于OpenMP的并行化工作... 我不记得它是否是OpenMP本身的一部分,还是其他什么东西? - Mr. Boy
1
@Eko:并不完全是这样。MPI启动了n个相同程序的实例,每个实例都有一个不同的ID号码存储在一个特殊变量中(请查找MPI_Comm_Rank)。如何处理这些n个实例由您决定。 - Stefano Borini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接