我正在尝试为我正在编写的程序学习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个地狱吗?
任何帮助都将不胜感激。
答案 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
其次,您的程序运行速度比顺序版本慢,这可能取决于多个因素。首先,您需要确保数组足够大,以便创建这些线程的开销(通常在创建并行区域时发生)可以忽略不计。此外,对于小型阵列,您可能遇到“缓存错误共享”问题,其中线程正在竞争同一缓存线,从而导致性能下降。