为什么并行应用程序比单线程应用程序花费更多时间?我正在使用带有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;
}
答案 0 :(得分:3)
如果编译器不优化循环,那么并行代码将受到 false sharing 的影响,因为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工作线程并在之后加入它们,这将使它比顺序版本慢。
答案 1 :(得分:1)
在上面的测试代码编译器本身优化代码。您需要更改测试代码。根据您创建的线程数量,还会增加开销。 同时参考Amdahl定律。