使用 #pragma OMP 并行使程序变慢

using #pragma omp parallel for make the program slower

本文关键字:程序 并行 #pragma OMP 使用      更新时间:2023-10-16

我的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 秒,这超过了按顺序运行程序所需的时间。

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

这可能会在很多方面出错:

  1. 在不知道result类型的情况下,可能必须内置障碍以避免在修改时出现竞争条件 - 您可以通过之后合并并行结果向量来避免这种情况。
  2. vec1vec2向量的复制开销可能大于性能奖励。

总而言之,这是一个关于可并行化向量类型的问题 -- 请参阅您选择的 openMP 文档以了解有关并行可访问类型的更多信息。

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

• 在循环区域内执行的

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

我知道我不喜欢例外的样子。

OpenMP API V4.0 第 59 页。