2

我有一个功能正在尝试与 OpenMP 并行化。我有一个大for循环,每次迭代都独立于其他迭代,我想使用类似的东西

#pragma omp for private(j)

并行化循环。

一个问题是循环的每次迭代都需要大量的临时工作空间,这足以让我认为如果我在每次迭代中分配和取消分配这个临时工作空间,它可能会降低性能。我的环境中有“工作区”对象,并且按原样重用旧工作区对象没有问题。

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

4

3 回答 3

3

您可以omp_get_max_threads()为所有线程使用和分配足够的工作空间(例如,带有omp_get_max_threads()元素的工作空间数组。),然后在每个线程上使用omp_get_thread_num()来了解哪个线程正在运行,以便它可以获得自己的工作空间。

于 2013-01-07T00:43:12.953 回答
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

}
于 2013-01-07T20:44:06.013 回答
1

我推荐使用对象池设计模式。 这是一个描述。您显然需要使工作区线程安全的获取和释放方法(ReusablePool 中的 3 个方法需要同步)。工作空间的数量将增长到任何时候所需的总数。回收的工作空间将被 ReusablePool 重用。

尽管对象池正在处理对象实例化,但它的主要目的是为客户端提供一种重用对象的方法,就像它们是新对象一样。

于 2013-01-07T01:05:40.797 回答