OpenMP:为什么 #pragma openmp parallel 在没有 for 的情况下应该有用?

OpenMP: why #pragma openmp parallel should be useful without for?

我是 OpenMP 初学者并且 from what I've read #pragma omp parallel:

It creates a team of N threads ..., all of which execute the next statement ... After the statement, the threads join back into one.

我无法想象在上面编写的指令后没有 for 关键字的情况下这可能有用的示例。我的意思是 for 关键字在团队线程之间拆分迭代,而使用上面的指令,以下 block/statement 将由所有线程执行,并且没有性能改进。你能帮我澄清一下吗?

您可以提供自己的机制将作业拆分为并行部分,但依赖 OpenMP 实现并行。

这是一个假设的例子,它使用 OpenMP 使一些操作出队,然后运行并行:

#pragma omp parallel
{
    operation op;
    while( queue.tryDequeue( &op ) )
        op.run();
}

queue.tryDequeue 的实现必须是线程安全的,即由关键 section/mutex 或无锁实现保护。

为了提高效率,op.run() 的实施必须 CPU 繁重,比 queue.tryDequeue() 花费的时间长得多,否则,您将花费大部分时间阻塞该队列,而不是进行可并行化的工作。

for关键字不分工!!!

您必须记住,划分工作意味着每个线程执行循环的一部分。如果你坚持使用#pragma omp parallel 那么它就像这样

#pragma omp parallel
{ 
   #pragma omp for
   for(int i= 1...100)
   {
   }
}

上面的代码所做的是在 n 个线程之间划分 for 循环,并且对于 n 个线程中的每个循环,#pragma omp for 中声明的任何内容都是该线程的私有变量。这确保了线程安全,也意味着您负责收集数据,例如使用归约操作