Multithreading OpenMP:why#pragma OpenMP parallel在没有for的情况下应该有用?

Multithreading OpenMP:why#pragma OpenMP parallel在没有for的情况下应该有用?,multithreading,parallel-processing,openmp,Multithreading,Parallel Processing,Openmp,我是OpenMP初学者,并且#pragma omp parallel: 它创建了一个由N个线程组成的团队…,所有线程都执行下一个线程 陈述在语句之后,线程重新连接成一个线程 我无法想象在上面编写的指令之后,如果没有for关键字,这个例子会有用。我的意思是,for关键字在团队的线程之间分割迭代,而使用上面的指令,以下块/语句将由所有线程执行,并且没有性能改进。您能帮我澄清一下吗?您可以提供自己的机制,将作业拆分为并行部分,但并行性依赖于OpenMP 下面是一个假设示例,它使用OpenMP将一些操作

我是OpenMP初学者,并且
#pragma omp parallel

它创建了一个由N个线程组成的团队…,所有线程都执行下一个线程 陈述在语句之后,线程重新连接成一个线程


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

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

下面是一个假设示例,它使用OpenMP将一些操作出列,然后并行运行:

#pragma omp parallel
{
    operation op;
    while( queue.tryDequeue( &op ) )
        op.run();
}
queue.tryDequeue
的实现必须是线程安全的,即由关键段/互斥锁或无锁实现保护


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

for关键字不划分工作

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

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

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

查看OpenMP任务…感谢您的回答。请你们看一下这个问题好吗?谢谢你们的回答。请你看一下这个问题好吗?