Openmp是一项并行化技术,是可以提高串行化程序的运行效率的,但需要使用正确的时间函数来进行衡量。
首先,先提出一个unix/linux下的内核时间获取函数和一个omp.h的一个库函数
1.clock()函数
原型:clock_t clock();
MSDN中的定义:Returns the processor time consumed by the program,返回的是处理器执行的时间,也就是说,只要内核中有程序在cpu中运行,时间就会增加,使用多核并行化技术并不能并行地计算使用的时间,仍然是进行叠加
返回值:返回时钟周期,要转化成时间需要除以常量宏CLOCKS_PER_SEC
2.omp_get_wtime()函数
原型:double omp_get_wtime();
MSDN中的定义:Returns a value in seconds of the time elapsed from some point,返回的是一个观察点的时间值,这个时间将一直在程序运行时持续,也就是说,在程序运行前使用和程序运行结束使用,这个时间差是整个程序运行的时间,而不是clock得到的cpu运行的时间
返回值:返回一个绝对时间值,单位是秒
然后,给出下面一段代码,说明区别:
这段代码是在双核ARMv7 处理器上运行出来的,使用的是Openmp并行技术,运行结果如下:
可以看出,使用单核和双核的clock时间大致相同,因为cpu总共的运行时间大致相同,时间并没有进行并行,但可以看到程序的运行时间缩短了将近一半,说明使用双核并行确实可以节省时间,提高计算效率。
PS:关于核与线程的关系,有一点需要说明,线程数最好不要大于核数,因为过多的线程会导致核之间的切换更加频繁,会增大相当大的额外开销,反而会影响运行效率,所以不建议使用超过核数的线程数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)