parallel-processing - 垂直和水平平行度

标签 parallel-processing openmp mpi

最近在并行领域工作,我知道有两个术语“垂直并行”和“水平并行”。有人说 openmp(共享内存并行)是垂直的,而 mpi(分布式内存并行)是水平的并行。为什么这样称呼这些术语?我不明白原因。这么称呼它们只是术语吗?

最佳答案

这些术语似乎并没有被广泛使用,也许是因为进程或系统经常没有区别地同时使用这两个术语。这些概念非常通用,涵盖的范围远不止 MPI 或 openmp 的领域。

垂直并行性是系统同时使用多个不同设备的能力。例如,一个程序可能有一个线程在做大量计算,而另一个线程在处理数据库查询,第三个线程在做 IO。大多数操作系统自然地暴露了这种能力。

当使用单个设备或对几个相似的数据项执行操作时,就会发生水平并行。例如,当在同一段代码上运行多个线程但数据不同时,就会发生这种并行性。

在软件世界中,一个有趣的例子实际上是 map reduce 算法,它同时使用:

  • 水平并行发生在map阶段,当数据被拆分和分散在几个cpu上进行处理时,
  • 垂直并行发生在map 和reduce 阶段之间,其中数据首先被分成块,然后由map 线程处理,并由reduce 线程累积,

  • 类似地,在硬件世界中,超标量流水线 CPU 确实使用这两种变体,其中流水线是垂直并行化的一个特定实例(就像 map/reduce staging,但有更多的步骤)。

    使用这个术语的原因可能与它用于供应链的原因相同:值(value)是通过链接不同的步骤或处理级别来产生的。最终产品可以看作是一个抽象的结构树(从下到上)或依赖(从上到下)的根,其中每个节点都是中间级别或步骤的结果。您可以在这里轻松看到供应链和计算之间的类比。

    关于parallel-processing - 垂直和水平平行度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832895/

    相关文章:

    c++ - 如何实现 MATLAB 与单独的 C++ 应用程序之间的通信?

    MPI:内核还是处理器?

    MPI 并行写入 TIFF 文件

    C++ OpenMP : Split for loop in even chunks static and join data at the end

    c - 使用多线程时低于预期的加速

    python - python中并行性的选择

    java - OpenMPI:MPI.Init 卡在 Java 中 - 如何调试?

    algorithm - 并行编程问题

    haskell - 为什么 MVar 不适用于 `par` ?

    go - 在 Go Playground 上没有得到预期的结果