open mp应用于while循环

时间:2014-05-11 11:18:15

标签: c++ openmp

我有以下递归代码,我正在尝试使用c ++ open mp库并行执行。目前我刚刚在循环之前添加了条款#pragma omp parallel(因为我不能使用由于visual studio仅支持omp 2.0的任务)但它实际上减慢了速度。我做错了什么?

确定。根据您对使用omp部分的建议,我已经重写了我的代码。所以现在看起来像下面。但是,它仍然比顺序版本慢..

  long long p (long long n, long long mmm)
  {
        long long c = 0;        
        long exponent = 0;
        double ex;
        long counter = 1;
        long long ttt = 0;
        long long ttt1 = 0;

        long long b = 0;
        long long a = 0;
        long long h = 0;


        while (counter > 0)
        {
            ex = pow(-1, counter - 1);
            exponent = (long) ex;

            ttt = (n - ( (counter * ( (3 * counter) - 1)) / 2));
            ttt1 = (n - ( (counter * ( (3 * counter) + 1)) / 2));
            #pragma omp parallel sections
            {
                #pragma omp section
                {                       
                    if (ttt == 0 || ttt == 1)
                        {
                            a = exponent * 1;
                            c = c + a;
                        }
                    else if (ttt>0)
                    {                       
                         a = exponent * p((n - ( (counter * ( (3 * counter) - 1)) / 2)), mmm);
                             c = c + a;
                    }
                }


                #pragma omp section
                {
                        //If n == 1 or 0 return 1 as per convention else do the calculation
                        if (ttt1 == 0 || ttt1 == 1)
                        {
                                b = exponent * 1;
                                c = c + b;
                        }
                        else if (ttt1 > 0)
                        {

                            b = exponent * p( (n - ( (counter * ( (3 * counter) + 1)) / 2)), mmm);
                            c = c + b;
                        }
                    }
           }    

            if (ttt < 0 && ttt1 < 0)
                break;

            ++counter;

        }

1 个答案:

答案 0 :(得分:1)

#pragma omp parallel定义了将并行运行的代码部分。这意味着您将拥有整个while循环的多个并行运行,而不是单个循环的迭代的并行运行。

这意味着OpenMP有大量开销来管理对变量的并发读/写访问,因此总运行时间更长。

如果您打算并行计算ab,您应该将整个if ... else if ... else标记为omp section,假设它们是完全独立的计算。

循环的自动并行化只能通过for的{​​{1}}循环来完成。