OpenMP:为什么#pragma openmp parallel应该没用?

时间:2016-07-04 02:54:38

标签: multithreading parallel-processing openmp

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

  

它创建了一个由N个线程组成的团队......所有这些线程都执行下一个   statement ...在语句之后,线程连接成一个。

我无法想象一个例子,在上面写的指令之后没有for关键字,这可能有用。我的意思是for关键字分割团队线程之间的迭代,而上面的指令将由所有线程执行以下块/语句,并且没有性能改进。你可以帮我解释一下吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

for关键字不会划分工作!!!

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

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

上面的代码所做的是在n个线程中划分for循环,对于n个线程,在#pragma omp中声明的任何东西都是该线程的私有变量。这可确保线程安全,也意味着您负责收集数据,例如使用还原操作