OpenMP部分比单线程运行得慢

时间:2015-05-10 23:24:24

标签: c parallel-processing openmp

为什么并行应用程序比单线程应用程序花费更多时间?我正在使用带有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;

}

2 个答案:

答案 0 :(得分:3)

如果编译器不优化循环,那么并行代码将受到 false sharing 的影响,因为mk很可能最终在同一个缓存中线。创建变量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定律。