根据条件选择OpenMP pragma

时间:2012-02-20 18:30:26

标签: c optimization scheduling openmp

我有一个我想要优化的代码应该在一系列线程ammount中运行。在我所使用的for循环中使用不同的调度技术运行一些测试后,我得出的结论是,当我只有一个线程并以其他方式引导时,最适合的是执行动态调度。这在openMP中是否可行?

更准确地说,我希望能够做到以下几点:

if(omp_get_max_threads()>1)
#pragma omp parallel for .... scheduling(guided)
else
#pragma omp parallel for .... scheduling(dynamic)
for(.....){
  ...
}

如果有人可以帮助我,我会很感激。另一种解决方案是将for循环写入两次并使用if条件。但是如果可能的话,我想避免这样做。

1 个答案:

答案 0 :(得分:8)

可能的解决方案是将循环复制到if语句中并将循环体“提取”到函数中以避免违反DRY原则。如果您将来需要更改此代码,则只有一个地方需要更改此代码:

void foo(....)
{
   ...
}

if(omp_get_max_threads()>1)
{
    #pragma omp parallel for .... scheduling(guided)
    for (.....)
        foo(....);
}
else
{
    #pragma omp parallel for .... scheduling(dynamic)
    for (.....)
        foo(....);
}