我正在开发一个同时使用粗粒度和细粒度多线程的应用程序。也就是说,我们手动管理线程池上的大型工作单元的调度,然后在这些工作单元中,某些功能利用OpenMP进行更细粒度的多线程。
我们通过在最昂贵的循环中选择性地使用OpenMP来实现收益,但是我们担心在我们将OpenMP块添加到更便宜的循环时为OpenMP工作池创建争用。有没有办法向OpenMP发出信号,如果一个代码块可用,那么代码块应该使用该池,如果没有,它应该串行处理该循环?
答案 0 :(得分:1)
你可以使用omp_set_num_threads(int)来设置no。池中的线程。然后编译器将尽可能尝试创建一个线程池并安排它们。如果无法创建池,那么它将创建尽可能多的线程并以串行方式运行其他线程。
答案 1 :(得分:0)
您可以通过巧妙地使用omp_get_num_threads
指令上的omp_set_num_threads
,if
和num_threads
以及parallel
条款来做您想做的事情。 OpenMP 3.0还提供了tasks
,这可能很有用。