【问题标题】:Parallelise list of independent instructions with OpenMP使用 OpenMP 并行化独立指令列表
【发布时间】:2014-07-05 22:00:39
【问题描述】:

我有一个(长)可以并行执行的独立指令列表。这些不在循环中,它们只是这样:

istr1;
istr2;
...
istrN;

如何使用 OpenMP 将它们并行化?我知道我可以在一些 Pthread 中手动拆分它们,但我想知道是否有更简单的方法,可以自动将线程数调整为 CPU 数,就像 OpenMP 一样。

【问题讨论】:

    标签: parallel-processing openmp


    【解决方案1】:

    这就是 OpenMP 部分的用途。

    #pragma omp parallel sections
    {
       #pragma omp section
       istr1;
       #pragma omp section
       istr2;
       ...
       #pragma omp section
       istrN;
    }
    

    另一种选择是使用显式任务:

    #pragma omp parallel
    {
       #pragma omp single
       {
          #pragma omp task
          istr1;
          #pragma omp task
          istr2;
          ...
          #pragma omp task
          istrN;
       }
    }
    

    任务是在single 构造中创建的,以防止在所有线程中创建它们(从而防止每个任务被创建 num_threads 次)。使用显式任务可能会带来更好的性能,因为大多数 OpenMP 运行时在调度部分时使用了相当愚蠢的逻辑。

    【讨论】:

    • 谢谢,这行得通。不幸的是,我的性能实际上变得更差了,可能是因为编译器可以对原始代码进行更好的优化,而指令不足以实际利用并行性。
    • OpenMP 引入了一些开销。如果每个部分/任务的代码花费很少的时间来完成,那么开销可能会如此之高,以至于抵消了并行运行的好处。也可能是您遇到了虚假分享等问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多