omp并行for循环(减少到find max)比串行代码慢

时间:2017-10-02 14:34:34

标签: openmp

我是使用OpenMP的新手。 我认为使用max reduction子句来查找数组的max元素并不是一个坏主意,但实际上并行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,它是具有8核的Intel Core i7-6700。

1 个答案:

答案 0 :(得分:0)

每当你并行化一个循环时,openMP需要执行一些操作,例如创建线程。这些操作会产生一些开销,这反过来意味着,对于每个循环,存在最小的迭代次数,在这种情况下并行化是不方便的。

如果我执行您的代码,我会获得相同的结果:

app.post("/search", async function(req, res){
    var test = []
    for (var key in req.body.movie){
        let foundMovie = await Movie.find({title: "Gotham"})
        test.push(foundMovie)
    }
    console.log(test)
    res.render("index")
});

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

./kp_omp
parallel maximum time 0.000570
serial maximum time   0.000253

我获得了

int bsize = 100000;

因此并行化版本比顺序版本更快。当您尝试加速代码执行时遇到的部分挑战是了解并行化的方便时间以及并行化的开销何时会破坏您预期的性能提升。