如何为多个线程创建临时数组,而不需要不断地分配和释放

How can I make temporary arrays for several threads without constantly allocating and deallocating?

本文关键字:不需要 释放 分配 数组 线程 创建      更新时间:2023-10-16

我有一个函数,我试图与OpenMP并行。我有一个大的for循环,其中每个迭代都是独立的,我想使用像

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

将循环并行化。

一个问题是,循环的每次迭代都需要大量的临时工作空间,我认为如果每次迭代只分配和释放一次这个临时工作空间,可能会降低性能。我的环境中有"工作空间"对象,按原样重用旧的工作空间对象没有问题。

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

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

也许我没有抓住重点,但是下面的策略对你来说不是很有用吗?

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
}

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

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