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个hellos吗?

任何帮助,将不胜感激。

首先,你没有看到4个“hello”的原因是因为并行执行的程序的唯一部分是包含在#pragma omp parallel所谓并行区域 。 在作为循环体的代码中(因为omp parallel指令附加到for语句), printf位于程序的顺序部分。

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

 #pragma omp parallel num_threads(4) { #pragma omp for reduction(+:mean) for (int i=0; i 

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