用openMP在C++中进行内存分配
Memory allocation and assignment in C++ with openMP
我正在使用openMP优化for循环。在每个线程中,都会临时使用一个大数组(当这个线程结束时不需要)。由于我不想重复分配&删除这些数组,所以我计划分配一大块内存,并为每个线程分配一部分。为了避免冲突,我应该为每个正在运行的线程都有一个唯一的ID,该ID不应该更改,也不能等于另一个线程。因此,我的问题是,我可以将函数omp_get_thread_num()返回的线程ID用于此目的吗?或者对于这样的存储器分配&分配任务?非常感谢!
您可以启动并行部分,然后开始分配变量/内存。在并行部分中声明的所有内容在它们自己的堆栈上都是线程私有的。示例:
#pragma omp parallel
{
// every variable declared here is thread private
int * temp_array_pointer = calloc(sizeof(int), num_elements);
int temp_array_on_stack[num_elements];
#pragma omp for
for (...) {
// whatever my loop does
}
// if you used dynamic allocation
free(temp_array_pointer);
}
一旦您的程序遇到一个平行区域,即它到达
#pragma omp parallel
线程(可能已经在程序初始化时启动,或者直到第一个并行结构才启动)将变为活动的。在并行区域内,任何分配内存的线程(例如,分配给数组)都将在其自己的专用地址空间内分配内存。除非线程释放内存,否则它将保留为整个并行区域分配的内存。
如果程序首先以串行方式为数组分配内存,然后在进入并行区域时将该数组复制到所有线程,请使用firstprivate
子句,并让运行时负责将数组复制到每个线程的专用地址空间。
考虑到所有这些,我看不出分配大量内存的意义,大概是在遇到并行区域之前,然后使用一些滚动自己的方法在线程之间共享内存。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配