我有点困惑在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);
1条答案
按热度按时间j2cgzkjk1#
首先创建一个并行块,为每个线程分配资源,然后拆分线程进行并行循环。