我有一个我想要优化的代码应该在一系列线程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条件。但是如果可能的话,我想避免这样做。
答案 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(....);
}