【问题标题】:Creating threads within a multithreaded for loop using openMP使用 openMP 在多线程 for 循环中创建线程
【发布时间】:2013-01-21 01:08:02
【问题描述】:

我是 OpenMP 新手,无法在每个线程循环迭代中创建线程。我的问题可能听起来很幼稚,请多多包涵。

#pragma omp parallel private(a,b) shared(f)
{
     #pragma omp for 
      for(...)
     {
      //some operations
      // I want to parallelize the code in italics along within in the multi threaded for loop
      *int x=func1(a,b);*
      *int val1=validate(x);*
      *int y=func2(a,b);*
      *int val2=validate(y);*
      }
}

【问题讨论】:

  • 我建议在底部添加一个段落来解释您的实际问题。从代码sn-p看不清楚。
  • 我能够并行化一个 for 循环,每个 for 循环迭代几乎没有顺序 CPU 功能。我想为循环的每次迭代使用线程来运行函数以节省时间。
  • 当循环的迭代已经分布在所有线程之间时,为什么还要并行运行这些函数,这超出了我的理解?

标签: c++ multithreading openmp


【解决方案1】:

在 for 循环中,所有线程都忙于循环迭代,因此没有剩余资源可以并行执行迭代中的内容。如果工作平衡良好,您将不会获得任何更好的性能。

如果很难/不可能很好地平衡工作与并行工作。您可以尝试在循环中生成任务,然后执行后续工作。但请注意任务生成的开销。

#pragma omp parallel private(a,b) shared(f)
{
     #pragma omp for nowait
      for(...)
     {
      //some operations

      #pragma omp task
      {
      int x=func1(a,b);
      int val1=validate(x);
      }

      #pragma omp task
      {
      int y=func2(a,b);
      int val2=validate(y);
      }

     }

     // wait for all tasks to be finished (implicit at the end of the parallel region (here))
     #pragma omp taskwait      
}

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多