首页 > 解决方案 > OpenMP:为什么减少比拆分任务快得多

问题描述

我实现了 2 个版本的 pi 近似值。我对其进行了测试,发现一个版本要快得多,但我真的不明白为什么。在第一个版本中,我创建了一个定义数量的进程大小的数组并更新了索引,在第二个版本中,我只使用了缩减。

第一个版本:

#pragma omp parallel private(x) shared(sum_vector)
    {
        int tid = omp_get_thread_num();
        for (int i = tid; i < num_steps; i += threads_number){
            x = (i+0.5)*step;
            sum_vector[tid] += 4.0/(1.0+x*x);
        }
    }

第二个版本:

#pragma omp parallel reduction(+:sum) private(x)
{
    int nthreads = omp_get_num_threads();
    int id = omp_get_thread_num();
    for (int i = id; i < num_steps; i += nthreads){
        x = (i+0.5)*step;
        sum = sum + 4.0/(1.0+x*x);
    }

}

对于 100 万次或更高次的迭代,第二个版本的速度几乎快了两倍。

我会很感激每一个答案!先感谢您!

标签: c++cparallel-processingopenmp

解决方案


推荐阅读