如何在C ++ openmp上编写重用线程的代码?

时间:2018-05-03 16:17:02

标签: c++ multithreading openmp

我有一个函数 f ,我可以使用并行处理。为此,我使用了openmp。 但是,这个函数被多次调用,似乎每次调用都会创建线程。

我们如何重用该线程?

var getInput = document.getElementById("input");

getInput.onkeyup = function(e) {
  if (e.keyCode == 13) {
    var i = 0;
    var text = input.value;

    function typing() {
      if (i < text.length) {
        document.getElementById('output').innerHTML += text.charAt(i);
        i++;
        setTimeout(typeWriter, 200);
      }
    }
    e.currentTarget.value = "";
  }
}

2 个答案:

答案 0 :(得分:5)

OpenMP在内部实现线程池,它会尝试重用线程,除非您在其间更改某些设置或使用不同的应用程序线程调用并行区域,而其他线程仍处于活动状态。

通过使用线程本地,可以验证线程确实相同。我建议您验证关于重新创建线程的声明。 OpenMP运行时除了明显的线程池概念之外还进行了许多智能优化,你只需要知道如何正确地调整和控制它。

虽然不可能重新创建线程,但是当你再次调用并行区域并且需要花费大量时间来唤醒线程时,很容易看到线程如何进入休眠状态。您可以使用OMP_WAIT_POLICY=active和/或特定于实现的环境变量(如KMP_BLOCKTIME=infinite(对于Intel / LLVM运行时)来阻止线程进入休眠状态。

答案 1 :(得分:3)

这只是Anton的正确答案的补充。如果您真的关心这个问题,对于大多数程序,您可以轻松地在外部移动并行区域并保持串行工作序列如下:

void f(X &src, Y &dest) {
   // You can also do simple computations
   // without side effects outside of the single section
   #pragma omp single
   {
   ... // do processing based on "src"
   }
   #pragma omp for // note parallel is missing
   for (...) { 

   }
   #pragma omp critical
   ...// each thread puts its own part of the output into "dest" 
}

int main() {
    ...
    // make sure to declare loop variable locally or explicitly private
    #pragma omp parallel
    for(type variable;...;...) {
       f(...);
    }
    ...
    return 0;
}

仅当您有测量证据证明您正在重新开启并行区域的开销时才使用此选项。您可能不得不使用共享变量或手动内联f,因为f中声明的所有变量都是私有的 - 因此它的详细信息取决于您的具体应用。