OpenMP平均数组

时间:2015-11-19 18:45:53

标签: c openmp

我正在尝试为我正在编写的程序学习OpenMP。对于其中的一部分,我试图实现一个函数来查找大数组的平均值。这是我的代码:

double mean(double* mean_array){
    double mean = 0;

    omp_set_num_threads( 4 );
    #pragma omp parallel for reduction(+:mean)



    for (int i=0; i<aSize; i++){
        mean = mean + mean_array[i];

    }

    printf("hello %d\n", omp_get_thread_num());



    mean = mean/aSize;

    return mean;

}

但是,如果我运行代码,它运行速度比顺序版本慢。另外对于我得到的打印声明:

hello 0
hello 0

对我来说没有多大意义,不应该有4个地狱吗?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,你没有看到4个“hello”的原因是因为并行执行的程序的唯一部分是所谓的并行区域包含在{{1 }}。在作为循环体的代码中(因为omp parallel指令附加到for语句),Here is my html code: <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"/> <div class="navicon"> <a href="#" class="exp"> <i class="fa fa-camera-retro fa-3x"></i> <em class="icon-text text-center">Creative</em> </a> </div>位于程序的连续部分。

按如下方式重写代码可以解决问题:

#pragma omp parallel

其次,您的程序运行速度比顺序版本慢,这可能取决于多个因素。首先,您需要确保数组足够大,以便创建这些线程的开销(通常在创建并行区域时发生)可以忽略不计。此外,对于小型阵列,您可能遇到“缓存错误共享”问题,其中线程正在竞争同一缓存线,从而导致性能下降。