C++ 使用动态线程数的性能差异

C++ 使用动态线程数的性能差异,c++,dynamic,openmp,C++,Dynamic,Openmp,我正在使用openMP对一些重循环进行并行化,它的工作原理与预期一致 测试表明,该指令的性能最好: #pragma omp parallel for num_threads(7) 然而,这可能因机器而异。此外,我希望能够使用运行时开关打开/关闭线程 因此,我想我可以用这样的东西: if(shouldThread) omp_set_num_threads(optimalNumberOfThreadsForThisMachine); else omp_set_num_threads

我正在使用openMP对一些重循环进行并行化,它的工作原理与预期一致

测试表明,该指令的性能最好:

#pragma omp parallel for num_threads(7)
然而,这可能因机器而异。此外,我希望能够使用运行时开关打开/关闭线程

因此,我想我可以用这样的东西:

if(shouldThread)
    omp_set_num_threads(optimalNumberOfThreadsForThisMachine);
else
    omp_set_num_threads(1);
在我的计算机上,本例中的最佳线程数为7。然后,改用此指令:

#pragma omp parallel for
它工作得很好-除了使用第二个指令编译的代码慢了大约50%。这是意料之中的事吗?我认为运行时必须进行动态调度和工作调度,而编译时指令可以添加某种优化


代码使用msvc 2013编译,在核心i7-3740上,您还可以通过if子句在运行时控制并行化:#pragma omp parallel。。。如果(run_in_par)其中
run_in_par
计算结果为零(并行区域被禁用)或非零(并行区域被激活)。除此之外,编译器没有那么聪明,第二种情况下的代码慢50%可能是由于其他原因。这也是我的第一个想法,但这相当于将2000行代码翻了一番,我宁愿避免这样做。我还失去了动态调整线程数量的能力。这些线程可以组合使用:
parallel。。。如果(在par中运行),则线程数(n线程数)
。为什么你要双重编码?它只是一个添加到现有OpenMP
parallel
区域的子句。