【问题标题】:omp parallel for loop (reduction to find max) ran slower than serial codesomp 并行 for 循环(减少到找到最大值)运行速度比串行代码慢
【发布时间】:2017-10-02 22:55:01
【问题描述】:

我是使用 OpenMP 的新手。 我认为使用 max reduction 子句来查找数组的最大元素并不是一个坏主意,但实际上并行 for 循环的运行速度比串行循环慢得多。

int main() {
double sta, end, elapse_t;
int bsize = 46000;
int q = bsize;
int max_val = 0;
double *buffer;
buffer = (double*)malloc(bsize*sizeof(double));
srand(time(NULL));
for(int i=0;i<q;i++)
    buffer[i] = rand()%10000;

sta = omp_get_wtime();
//int i;
#pragma omp parallel for reduction(max : max_val)
for(int i=0;i<q; i++)
{
    max_val = max_val > buffer[i] ? max_val : buffer[i];
}
end = omp_get_wtime();
printf("parallel maximum time %f\n", end-sta);

sta = omp_get_wtime();
for(int i=0;i<q; i++)
{
    max_val = max_val > buffer[i] ? max_val : buffer[i];
}
end = omp_get_wtime();
printf("serial maximum time   %f\n", end-sta);

free(buffer); 
return 0;}

编译命令

gcc-7 kp_omp.cpp -o kp_omp -fopenmp

执行结果

./kp_omp 
parallel maximum time 0.000505
serial maximum time   0.000266

CPU 是 Intel Core i7-6700 8 核。

【问题讨论】:

    标签: openmp


    【解决方案1】:

    每当您并行化循环时,openMP 都需要执行一些操作,例如创建线程。这些操作会导致一些开销,这反过来意味着,对于每个循环,都有一个不方便并行化的最小迭代次数。

    如果我执行你的代码,我会得到与你相同的结果:

    ./kp_omp
    parallel maximum time 0.000570
    serial maximum time   0.000253
    

    但是,如果我在第 8 行修改 bsize,则

    int bsize = 100000;
    

    我得到

    ./kp_omp
    parallel maximum time 0.000323
    serial maximum time   0.000552
    

    所以并行版本比顺序版本更快。当您尝试加快代码执行速度时,您遇到的部分挑战是了解何时便于并行化以及何时并行化的开销会扼杀您预期的性能增益。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2015-03-24
      相关资源
      最近更新 更多