2010-04-21 72 views
1

我正在使用粗粒度和细粒度多线程的应用程序。也就是说,我们手动管理线程池上的大型工作单元的调度,然后在这些工作单元中,某些功能利用OpenMP进行更细粒度的多线程。如何处理OpenMP线程池争用

我们已经通过在我们最昂贵的循环中有选择地使用OpenMP来实现收益,但是担心会在OpenMP块添加到更便宜的循环中时为OpenMP工作池创建争用。有没有一种方法可以向OpenMP发出信号:如果代码块可用,那么应该使用该代码块;如果没有,它应该连续处理循环?

回答

0

您可能能够在parallel指令做你想做的通过巧妙地利用omp_get_num_threadsomp_set_num_threadsifnum_threads条款。 OpenMP 3.0还提供了可能有用的tasks

1

您可以使用omp_set_num_threads(int)设置no。池内的线程数。然后编译器会尽可能地创建一个线程池并安排它们。如果无法创建池,那么它将创建尽可能多的线程并以串行方式运行其他线程。

for more info try this link

+0

它是创建线程的运行时 - 不是编译器。如果请求的线程数多于可创建的线程数,那么它取决于OpenMP规范概述的许多因素。如果ICV dyn-var(它控制线程数量的动态调整)是“false”,那么它将被实现定义为将发生什么。如果dyn-var是“true”,那么它会得到一些线程并且并行地运行该区域。除非嵌套平行关闭“关闭”或不支持,否则区域将不会连续运行。 – ejd 2011-05-04 14:50:08

相关问题