【问题标题】:OpenMP, multithreading or multiprocessing (C)?OpenMP、多线程还是多处理(C)?
【发布时间】:2014-05-02 10:16:15
【问题描述】:

我无法理解 OpenMP 的工作原理。我知道它并行执行任务并且它是一个多处理工具,但它是什么意思?

它使用“线程”,但同时它是一个多处理工具?两者不是互斥的,您使用一种方法而不使用另一种方法吗?你能帮忙解释一下是哪一个吗?

为了澄清,我只使用 POSIX pthread 处理多线程。这与使用 fork 和 exec 以及共享内存的多处理完全不同。

谢谢。

【问题讨论】:

    标签: c multithreading multiprocessing ipc openmp


    【解决方案1】:

    OpenMP 被开发为允许使用多线程共享内存的并行架构的抽象层,因此您不必编写经常使用的并行代码从头开始。注意,通常线程仍然可以访问共享内存(主线程分配的内存)。它利用多个处理器,但使用线程。

    MPI 是其对应的分布式系统。这可能更像是您正在考虑的传统“多处理”版本,因为所有“等级”彼此独立运行,没有共享内存,并且必须通过分散/映射/减少等概念进行通信。

    【讨论】:

    • 我一直认为我们真正需要的是结合两者的东西。由于两者是分开的,重新排列代码以将 OpenMP 线程移动到 MPI 分布式系统中的不同服务器是一件苦差事。如果只有一个分发/并行化工具,那么这样的举动可能只是一项重新配置工作。
    【解决方案2】:

    OpenMP 用于多线程。我非常深入地介绍了如何使用 OpenMP 和其中的陷阱:

    http://austingwalters.com/the-cache-and-multithreading/

    它的工作原理非常类似于 POSIX pthreads,除了没有大惊小怪。它被开发用于合并到已经开发的代码中,然后用适当的编译器重新编译(g++、clang/llvm 目前无法工作)。如果您单击我上面的链接,您会注意到一个线程启用了多处理,因为它可以在 任何 可用的处理器上执行。

    意思是如果你有一个单核,线程仍然可以更快地执行,因为你的处理器在所有程序之间共享时间。如果您有多个处理器和多个线程,则可以同时从不同的处理器访问线程,因此执行速度更快。

    进一步的 OpenMP 允许共享(和非共享内存),具体取决于实现,我相信您也可以将 OpenMP 与 POSIX 线程一起使用,但如果正确使用 pthread,您将不会获得任何优势.

    以下是 OpenMP 优秀指南的链接:

    http://bisqwit.iki.fi/story/howto/openmp/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多