我是OpenMP初学者和from what I've read #pragma omp parallel
:
它创建了一个由N个线程组成的团队......所有这些线程都执行下一个 statement ...在语句之后,线程连接成一个。
我无法想象一个例子,在上面写的指令之后没有for
关键字,这可能有用。我的意思是for
关键字分割团队线程之间的迭代,而上面的指令将由所有线程执行以下块/语句,并且没有性能改进。你可以帮我解释一下吗?
答案 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中声明的任何东西都是该线程的私有变量。这可确保线程安全,也意味着您负责收集数据,例如使用还原操作