使用#pragma omp parallel使程序变慢

时间:2015-02-08 20:05:16

标签: c++ openmp

我的C ++程序需要大约300秒才能运行。 在我的程序中,我需要cwis划分我的向量。 VS分析仪告诉我这需要大约15%的运行时间。这是代码:

template <class T> myVector<T> cWisDivide(myVector<T> &vec1, 

myVector<T> &vec2)
{
    try
    {
        if (vec1._rows == vec2._rows)
        {
            myVector<T> result(vec1._rows);
            //#pragma omp parallel for 
            for (int r = 1; r <= vec1._rows; r++)
            {
                if (vec2(r) != 0)
                {
                    result(r) = vec1(r) / vec2(r);
                }
                else
                {
                    throw std::runtime_error("");
                }
            }
            return result;
        }
    }
    catch (const exception &e)
    {
        ....
    }
}

多次调用此函数。 如果我在循环之前使用#pragma ...,则cpu使用率会持续100%,持续约350秒。这比按顺序运行程序的时间要多。

如果有人能在这个问题上帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

这可能在很多方面出错:

  1. 在不知道result的类型的情况下,可能必须构建障碍以避免在修改时出现竞争条件 - 您可以通过使用之后合并的并行结果向量来避免这种情况。
  2. vec1vec2向量的复制开销可能大于性能奖励。
  3. 总而言之,这是一个关于可并行化矢量类型的问题 - 请参阅您选择的openMP文档,以了解有关可并行访问的类型的更多信息。

答案 1 :(得分:0)

无论如何,我只是从OMP规范中查找了......

•在循环区域内执行的throw必须导致执行在循环区域的同一次迭代中恢复,并且抛出异常的同一线程必须捕获它。

我知道我不喜欢异常的样子。

OpenMP API V4.0第59页。