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