我正在使用openMP优化for循环。在每个线程中,将暂时使用一个大型数组(此线程完成时不需要)。因为我不想重复分配&删除这些数组,所以我打算分配一个大的内存块,并为每个线程分配一个部分。为了避免冲突,我应该为每个正在运行的线程都有一个唯一的ID,它不应该更改,也不能等于另一个线程。所以我的问题是,为此可以使用函数omp_get_thread_num()返回的线程ID吗?或者是否有任何有效的解决方案用于此类内存分配&作业任务?非常感谢!
答案 0 :(得分:2)
您可以启动并行部分,然后开始分配变量/内存。在并行部分中声明的所有内容在其自己的堆栈上都是线程私有的。例如:
#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);
}
答案 1 :(得分:0)
一旦你的程序遇到并行区域,就一旦它命中
#pragma omp parallel
线程(可能在程序初始化时启动,或者直到第一个并行构造时才启动)将变为活动状态。在并行区域内,任何将内存分配给数组的线程都将在其自己的私有地址空间内分配该内存。除非线程释放内存,否则它将保留为整个并行区域分配。
如果您的程序首先串行为数组分配内存,然后在进入并行区域时将该数组复制到所有线程,请使用firstprivate
子句并让运行时间负责复制数组到每个线程的私有地址空间。
考虑到所有这些,我没有看到分配的大小,大概是在遇到并行区域之前,大量的内存然后在线程之间共享它使用一些自己的方法来根据计算分配它线程ID。