如何在不经常分配和解除分配的情况下为多个线程创建临时数组?

时间:2013-01-07 00:04:49

标签: c++ parallel-processing openmp

我有一个函数,我正在尝试与OpenMP并行化。我有一个很大的for循环,每次迭代都独立于其他循环,我想使用像

这样的东西
#pragma omp for private(j)

并行循环。

一个问题是循环的每次迭代都需要大量的临时工作空间,如果我每次迭代分配和释放一次临时工作空间,我认为它可能会破坏性能。我的环境中有“workspace”对象,并且没有与按原样重用旧工作区对象相关的问题。

如何在制作线程之前为每个线程分配工作空间(我不知道它们中有多少个)?如何告诉每个线程从池中选择一个唯一的工作区对象?

3 个答案:

答案 0 :(得分:3)

您可以使用omp_get_max_threads()并为所有线程分配足够的工作空间(例如,具有omp_get_max_threads()元素的工作空间数组。),然后在每个线程上使用omp_get_thread_num()来知道哪个线程正在运行,因此它可以获得自己的工作区。

答案 1 :(得分:2)

也许我错过了这一点,但以下策略不适合你吗?

void foo() {

  #pragma omp parallel
  {
    // allocate work-space here, so to make it private to the thread
    thread_workspace t;

    #pragma omp for
    for(int j = 0; j < N; j++) {
      // Each thread has its local work-space allocated outside the for loop
    }
  } // End of the parallel region

}

答案 2 :(得分:1)

我建议使用对象池设计模式。 Here's描述。您显然需要使工作空间的获取和释放方法线程安全(ReusablePool中的3个方法需要同步)。工作空间的数量将增加到任何时候所需的总数。返回的工作空间将由ReusablePool重用。

  

虽然对象池正在处理对象实例化   主要目的是为客户提供重用对象的方法   就像它们是新物体一样。