Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 根据条件选择OpenMP pragma_C_Optimization_Scheduling_Openmp - Fatal编程技术网

C 根据条件选择OpenMP pragma

C 根据条件选择OpenMP pragma,c,optimization,scheduling,openmp,C,Optimization,Scheduling,Openmp,我有一个我想优化的代码,它应该在不同的线程中运行。在我使用的for循环中使用不同的调度技术运行了一些测试之后,我得出结论,当我只有一个线程时,最适合的是执行动态调度,否则会被引导。这在openMP中可能吗 更准确地说,我希望能够做到以下几点: if(omp_get_max_threads()>1) #pragma omp parallel for .... scheduling(guided) else #pragma omp parallel for .... scheduling(dy

我有一个我想优化的代码,它应该在不同的线程中运行。在我使用的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语句中,并将循环体“提取”到函数中,以避免违反原则。如果将来需要更改此代码,则只有一个地方需要更改此代码:

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(....);
}

我能想到的唯一方法是将循环复制到if语句中……这也是我最后的意思。不好,我有点累了。我知道这是一种解决方案,但它也会增加代码的复杂性和大小。这就是为什么这是我最后的选择。我认为“神秘”的想法是正确的。#pragma通常控制编译时发生的事情,因此,为
for
循环生成的代码在这两者之间可能不同——您可以使用运行时条件自行选择#pragma。您还可以将循环体编写为一个大型多行宏。这节省了一点代码复制。但它很丑陋。@神秘:为什么?简单的函数应该可以很好地工作,我想+1只用于在函数调用中放置循环体。将其添加到您的答案中,因为它隐藏在注释下。@Mystical:完成。现在应该足够清楚了。如果您认为应该对其进行编辑,请随意编辑;)