我有点困惑,在OpenMP并行for循环中使用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. for each 线程分配一个循环外公共数组

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

推荐答案

首先创建一个并行块, for each 线程分配资源,然后拆分线程进行并行循环.

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

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

  free(p);
}

C++相关问答推荐

C strlen on char array

了解一些CLIPS原语数据类型

字符串令牌化xpath表达式

为什么在此程序中必须使用Volatile关键字?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

在为hashmap创建加载器时,我的存储桶指向它自己

如何在C语言中正确打印图形

如何使解释器存储变量

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

使用nmake for程序比Hello World稍微复杂一些

Valgrind用net_pton()抱怨

如何使用空元素块声明指针数组

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

如果类型是新的,offsetof是否与typeof一起工作?

解密Chrome加密密钥

使用 strtok 多次分割一个字符串会导致意外行为

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

GDB 用内容初始化数组

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?