我有一个我想要优化的代码,它应该在各种线程中运行。在我拥有的 for 循环中使用不同的调度技术运行一些测试后,我得出的结论是,最适合的是在我只有一个线程时执行动态调度,否则进行引导。这在 openMP 中甚至可能吗?
更准确地说,我希望能够执行以下操作:
if(omp_get_max_threads()>1)
#pragma omp parallel for .... scheduling(guided)
else
#pragma omp parallel for .... scheduling(dynamic)
for(.....){
...
}
如果有人能帮助我,我将不胜感激。另一种解决方案是编写两次 for 循环并使用 if 条件。但如果可能的话,我想避免这种情况。
最佳答案
可能的解决方案是将循环复制到 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(....);
}
关于根据条件选择 OpenMP pragma,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366466/