加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用#pragma omp parallel使程序变慢

发布时间:2020-12-16 07:10:52 所属栏目:百科 来源:网络整理
导读:我的C程序需要大约300秒才能运行. 在我的程序中,我需要cwis划分我的向量. VS分析仪告诉我这需要大约15%的运行时间.这是代码: template class T myVectorT cWisDivide(myVectorT vec1,myVectorT vec2){ try { if (vec1._rows == vec2._rows) { myVectorT re
我的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秒.这比按顺序运行程序所花费的时间多.

如果有人能帮我解决这个问题,我将不胜感激.

解决方法

这可能在很多方面出错:

>在不知道结果类型的情况下,可能必须构建障碍以避免在修改时出现竞争条件 – 您可以通过使用之后合并的并行结果向量来避免这种情况.
> vec1和vec2向量的复制开销可能大于性能奖励.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读