c - openmp 中的 malloc 用于并行循环

标签 c openmp

我有点困惑在 openmp 并行 for 循环中使用 malloc()/free() 的更好方法是什么。我想到了两种方法,但不知道哪种方法更好。我从之前的答案中了解到,循环中的 malloc/free 可能会造成内存碎片。

假设我有一个运行超过一百万次的循环

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。为每个线程在循环外分配一个公共(public)数组

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);

最佳答案

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

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

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

  free(p);
}

关于c - openmp 中的 malloc 用于并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76296136/

相关文章:

c++ - 在一个范围内生成不同的随机数

c - 了解 shell 实现中的命令执行

c++ - 在 arm 上使用 openMP 进行矩阵 vector 乘法

c - 使用 openmp 并行化矩阵以避免错误共享

c - 使用 fgetc 读取文件意外停止

c++ - 从 popen 获取 PID

c - 程序在尝试对结构的指针成员进行 malloc 时出现段错误

c - OpenMp和代码块16?

c++ - OpenMP 截断 float

winapi - 将 OpenMP 与 Windows SDK 结合使用