openmp中的malloc用于并行循环

lpwwtiir  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(175)

我有点困惑在openmp parallel for loop中使用malloc()/free()的更好方法是什么。这里有两种方法,我想,但我不知道哪种方法是更好的。我从前面的答案中了解到,malloc/free in循环可以分割内存。
假设我有一个循环,它运行了上百万次

for (size_t i = 0 ; i< 1000000; ++i){
    double * p = malloc(sizeof(double)*FIXED_SIZE); 

    /* FIXED_SIZE is some size constant 
    for the entire loop but is only determined dynamically */

    ....... /* Do some stuff using p array */

    free(p);
}

现在我想用openmp并行化上面的循环
方法-1.简单地在for循环的顶部添加一个杂注

#pragma omp parallel for
for (size_t i = 0 ; i< 1000000; ++i){

    #pragma omp atomic
    double * p = malloc(sizeof(double)*FIXED_SIZE); 
    
    ....... /* Do some stuff using p array */

    #pragma omp atomic
    free(p);
}

方法-2。为每个线程分配一个循环外的公共数组

int num_threads = omp_get_num_threads();
double * p = malloc(sizeof(double)*FIXED_SIZE * num_threads); 

#pragma omp parallel for
for (size_t i = 0 ; i< 1000000; ++i){

    int thread_num = omp_get_thread_num();

    double * p1 = p + FIXED_SIZE*thread_num ;
    
    ....... /* Do some stuff using p1 array */
}
free(p);
j2cgzkjk

j2cgzkjk1#

首先创建一个并行块,为每个线程分配资源,然后拆分线程进行并行循环。

#pragma omp parallel
{
  double * p = malloc(sizeof(double)*FIXED_SIZE);

  #pragma omp for
  for (size_t i = 0 ; i< 1000000; ++i) { ... }

  free(p);
}

相关问题