我有点困惑,在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);