OpenMp 程序优化,怎么让并行达到并行的效果!

参考链接:http://blog.csdn.net/donhao/article/details/5651156


常用的库函数

函数原型                                        功能

int omp_get_num_procs(void)     返回当前可用的处理器个数

int omp_get_num_threads(void)  返回当前并行区域中的活动线程个数,如果在并行区域外部调用,返回1

int omp_get_thread_num(void)    返回当前的线程号(个人感觉这里为omp_get_thread_ID好一些)

int omp_set_num_threads(void)  设置进入并行区域时,将要创建的线程个数


写了个并行程序,本来吧,不用并行的时候运行时间:680000   

在程序里的两个差不多的for循环中加入了#pragma omp parallel for 糟糕了,时间变成了34130000,俺用的是4个核心,俺很感伤。

我又把代码换成了 #pragma omp parallel for shedule(runtime)时间终于变成了12400000,依然很感伤,慢了20倍。

查了资料,乒乓效应看不懂,不过应该是它。

所以我把代码有换成了 #pragma omp parallel for private(i,sum,s) shedule(runtime)

于是我开心了,因为时间变成了1280000,可是伤感啊,速度还是没有提高啊。

把private(sum)改成reduction(+:sum) 1290000没有明显改善。


终于,忍不住找老师帮了忙,原本定义时刻的是:clock_t t1,t2;用clock()提取自己想要的时间。

后来改成了,double t1,t2; 用 omp_get_wtime()函数提取自己想要的时刻。

用 export OMP_NUM_THREADS=1或2或3或4来测试自己的的程序运用不同核心数时候的速度。

发现,核心数为1时:Time is 1.032s

           核心数为2时:Time is 0.568s

           核心数为3时:Time is 0.403s

           核心数为4时:Time is 0.322s


加速了哦!不知道还可以怎么优化,暂时就这样吧,大家有建议,可以提议提!

你可能感兴趣的:(OpenMp 程序优化,怎么让并行达到并行的效果!)