为什么并行应用程序的执行时间比单线程应用程序要长?我使用的是一台装有Ubuntu 14.04的8 CPU计算机。代码只是我测试omp并行部分的简单方法,后面的目的是在两个不同的线程中同时运行两个不同的函数,所以我不想使用#杂注omp并行。
并行:
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;
}
发布于 2015-05-11 15:52:58
如果编译器不优化循环,那么并行代码将遭受错误共享,因为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工作线程并随后加入它们的开销,这将使其比顺序版本更慢。
发布于 2015-05-11 15:02:36
在上面的测试中,代码编译器自己优化了代码。您需要更改测试代码。根据您创建的线程数量,还会增加额外的开销。另请参阅Amdahl定律。
https://stackoverflow.com/questions/30157675
复制相似问题