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 中声明的任何内容都是该线程的私有变量。这确保了线程安全,也意味着您负责收集数据,例如使用归约操作
我是 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 中声明的任何内容都是该线程的私有变量。这确保了线程安全,也意味着您负责收集数据,例如使用归约操作