我有点困惑在 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/