用openMP在C++中进行内存分配

Memory allocation and assignment in C++ with openMP

本文关键字:内存 分配 openMP C++      更新时间:2023-10-16

我正在使用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子句,并让运行时负责将数组复制到每个线程的专用地址空间。

考虑到所有这些,我看不出分配大量内存的意义,大概是在遇到并行区域之前,然后使用一些滚动自己的方法在线程之间共享内存。