使用 openMP 减少执行时间

计算科学 优化 C 高性能计算
2021-12-15 08:40:21

我有这个计算斐波那契函数的方法:

long optimized_p_fib(long n)
{
    long i, j;
    if(n < 2)
        return n;

    #pragma omp task shared (i)
    {
        i = p_fib(n-1);
    }
    #pragma omp task shared (j)
    {
        j = p_fib(n-2);
    }        
    #pragma omp taskwait

    return (i+j);
}

此方法的执行时间为2.527737
我想在 OpenMP 中使用任务,这样执行时间会更小,下面是我到目前为止所做的,但与上面的方法相比,执行时间变大了( 4.039427 )。

long optimized_p_fib(int n)
{
    long i, j;
    if(n < 2)
        return n;

    #pragma omp single nowait
    {
        #pragma omp task shared (i) firstprivate(n)
        {
            i = optimized_p_fib(n-1);
        }
        #pragma omp task shared (j) firstprivate(n)
        {
            j = optimized_p_fib(n-2);
        }
    }
    #pragma omp taskwait

    return (i+j);
}

我可以优化我的代码,以使执行时间变小?

1个回答

您使用的算法会产生非常便宜的任务,尤其是在小时。由于您没有更改算法的奢侈,因此避免创建廉价任务的开销的唯一合理(相对)方法是在递归树底部附近引入另一个 - 条件。nif

所以,现在你有一个的基线案例(简单地说)。我建议您为添加另一个- 条件,首先尝试,将在不产生 OpenMP 任务的情况下计算函数的值。n<2return nifn<kk<n2

另一件事是您忘记添加该行

#pragma omp parallel

节前

#pragma omp single nowait

#pragma会导致池中的所有线程执行下一个代码块。这可能会在第二个版本代码中减少一点时间,并使执行时间更接近第一个版本。

我还建议您访问以下有关基本OpenMP+Tasks的网页,您可以在其中找到仍然遵循作业充分利用计算之间的适当平衡