如何为多个线程创建临时数组,而不需要不断地分配和释放
How can I make temporary arrays for several threads without constantly allocating and deallocating?
我有一个函数,我试图与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重用。
虽然对象池正在处理对象实例化,但它是主要目的是为客户端提供一种重用对象的方法就像它们是新对象一样。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么不需要手动释放矢量?
- 释放不需要的Q图像
- 如何为多个线程创建临时数组,而不需要不断地分配和释放