根据条件选择 OpenMP pragma

标签 c optimization scheduling openmp

我有一个我想要优化的代码,它应该在各种线程中运行。在我拥有的 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/

相关文章:

c# - 优先使用多线程的作业调度程序

c - 使用 Makefile 进行简单编译?

python - scipy优化中的整数步长最小化

c - 仅回叫w'r't编程,为什么要使用?

python - 如何将 0/1 转换为高效签名?

python - 如何将许多列汇总为独特的组合

java - return 关键字后的调度程序

Laravel 队列作业自动处理,无需任何队列 :work or listen command

c++ - 自己声明printf函数(使用Visual Studio 2012和c++)

c - 反斜杠-换行符组合如何影响 C 预处理器的 __LINE__ 宏的值?