[英]OpenMP sections run slower than single thread
为什么并行应用程序比单线程应用程序花费更多时间? 我正在使用带有Ubuntu 14.04的8 CPU计算机。 代码只是我测试omp并行部分的简单方法,后来的目的是在两个不同的线程中同时运行两个不同的函数,所以我不想使用#pragma omp parallel for。
平行:
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;
}
和单线程:
int main()
{
int m = 0;
int k = 0;
for( k = 0; k < 1e9; k++ ){};
for( m = 0; m < 1e9; m++ ){};
return 0;
}
如果编译器不优化循环,则并行代码将遭受错误共享,因为m
和k
很可能最终在同一缓存行中。 将变量设为private
:
#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工作线程并在之后加入它们,这将使它比顺序版本慢。
在上面的测试代码编译器本身优化代码。 您需要更改测试代码。 根据您创建的线程数量,还会增加开销。 同时参考Amdahl定律。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.