【问题标题】:Is parallel programming == multithread programming?并行编程==多线程编程?
【发布时间】:2011-01-18 06:20:52
【问题描述】:

并行编程==多线程编程吗?

【问题讨论】:

标签: multithreading terminology parallel-processing concurrent-programming


【解决方案1】:

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

除非多线程发生在单核上,在这种情况下它只是并发的。

【讨论】:

  • AFAIK,在单核处理器上,线程不是并行的。它是并发的,但不是并行的。
  • 并发和并行之间的区别在于,并行是真正同时的,而并发看起来好像是同时的。线程之间的切换非常快,看起来好像是并行的,但事实并非如此。也许还有其他术语指定这一点,但这就是我的理解。
  • @LucasLindström:不,并行在计算机科学领域具有特殊含义,您的链接具有误导性。
  • 这个答案也具有误导性。多线程只是意味着并发,而不是并行。换句话说,您可以在单核处理器上拥有多线程。
【解决方案2】:

不一定。您可以在多个进程甚至多台机器之间分配作业——我不会将其归类为“多线程”编程,因为每个进程可能只使用一个线程,但它肯定是并行编程。诚然,您可能会争辩说,对于多个进程,整个系统中有多个线程......

最终,像这样的定义只在上下文中有用。在您的特定情况下,它会有什么不同?还是只是出于兴趣?

【讨论】:

  • 我们是否也应该将 SIMD 视为并行编程?我们正在对多个数据并行执行相同的操作,但我不知道这是否被认为是包含在并行编程定义中的微并行化。
  • 我会说 SIMD 是更多并行硬件设计,但我想在某种程度上你必须考虑拥有专用并行硬件的编程方面,例如为 GPU 编程呢?
【解决方案3】:

没有。多线程编程意味着你有一个进程,而这个进程会生成一堆线程。所有线程同时运行,但它们都在同一个进程空间下:它们可以访问相同的内存,具有相同的打开文件描述符,等等。

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

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

OpenMP 的优点是非常透明。有一个循环并行化?只需添加几个指令,编译器将其分块,并将循环的每个部分分配给不同的处理器。不幸的是,您需要一个共享内存架构。具有基于节点架构的集群无法在集群级别使用 OpenMP。 MPI 允许您在基于节点的架构上工作,但您必须为更复杂且不透明的使用付出代价。

【讨论】:

  • ow,所以这意味着 1 个作业由 n 个进程处理,而不是 1 个作业由 n 个线程处理
  • 我似乎记得正在在多进程架构的 OpenMP 风格并行化上完成工作......我不记得它是否是 OpenMP 本身的一部分,或者还有什么?
  • @Eko :不完全是。 MPI 启动同一程序的 n 个实例,每个实例在一个特殊变量中具有不同的 id 号(查找 MPI_Comm_Rank)。如何处理这 n 个实例取决于您。
最近更新 更多