首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenMP段的运行速度比单线程慢

OpenMP段的运行速度比单线程慢
EN

Stack Overflow用户
提问于 2015-05-11 07:24:24
回答 2查看 1.3K关注 0票数 4

为什么并行应用程序的执行时间比单线程应用程序要长?我使用的是一台装有Ubuntu 14.04的8 CPU计算机。代码只是我测试omp并行部分的简单方法,后面的目的是在两个不同的线程中同时运行两个不同的函数,所以我不想使用#杂注omp并行。

并行:

代码语言:javascript
运行
复制
int main()
{
int k = 0;
int m = 0;

omp_set_num_threads(2);

#pragma omp parallel
{
    #pragma omp sections
    {
        #pragma omp section
        {
            for( k = 0; k < 1e9; k++ ){};
        }

        #pragma omp section
        {
            for( m = 0; m < 1e9; m++ ){};
        }
    }
}

return 0;

}

和单线程:

代码语言:javascript
运行
复制
int main()
{
int m = 0;
int k = 0;

for( k = 0; k < 1e9; k++ ){};


for( m = 0; m < 1e9; m++ ){};

return 0;

}
EN

回答 2

Stack Overflow用户

发布于 2015-05-11 15:52:58

如果编译器不优化循环,那么并行代码将遭受错误共享,因为mk很可能在同一缓存行中结束。将变量设为private

代码语言:javascript
运行
复制
#pragma omp parallel private(k,m)
{
    #pragma omp sections
    {
        #pragma omp section
        {
            for( k = 0; k < 1e9; k++ ){};
        }

        #pragma omp section
        {
            for( m = 0; m < 1e9; m++ ){};
        }
    }
}

在高优化级别,编译器可以完全删除循环。但是,并行版本仍然会增加产生OpenMP工作线程并随后加入它们的开销,这将使其比顺序版本更慢。

票数 3
EN

Stack Overflow用户

发布于 2015-05-11 15:02:36

在上面的测试中,代码编译器自己优化了代码。您需要更改测试代码。根据您创建的线程数量,还会增加额外的开销。另请参阅Amdahl定律。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30157675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档