Linux平台多线程程序中使用clock()计算程序执行时间存在问题
今天在Linux下测试对一个程序使用openmp进行部分优化后的执行时间的比较。
根据之前在Windows下的经验,判断一个代码段执行的时间,是使用clock()函数在代码段的开始和结束分别产生一个clock_t的值,然后后者减去前者再除以CLOCKS_PER_SEC,得到一个秒值。
这次测试的时候发现了很奇怪的问题,使用openmp优化过后的执行时间居然比优化前的执行时间多了两倍,这个是令人百思不得其解的问题。 (全文…)
今天在Linux下测试对一个程序使用openmp进行部分优化后的执行时间的比较。
根据之前在Windows下的经验,判断一个代码段执行的时间,是使用clock()函数在代码段的开始和结束分别产生一个clock_t的值,然后后者减去前者再除以CLOCKS_PER_SEC,得到一个秒值。
这次测试的时候发现了很奇怪的问题,使用openmp优化过后的执行时间居然比优化前的执行时间多了两倍,这个是令人百思不得其解的问题。 (全文…)
平时写测试程序的时候常常要计算程序执行的时间,尤其是最近练习Intel多核编程时,需要判断打开openmp参数与否的执行时间的比较。
通常代码是这样写的:
#include <time.h>
clock_t start, stop;
....
start = clock();
do_something();
stop = clock();
printf("%f", (double)(stop-start)/1000.0) ;
.....
或者是求当前时间的秒值:
double t = (double) clock()/1000.0;
但是这样的代码在Windows平台下是正确的(当然会这样写也是因为上Intel培训课时,例程都是这么写的 ),而到了Linux平台下,这个程序就错了,会发现时间一下多了1000倍。
事实上,clock_t的值转换为秒应该是除以CLOCKS_PER_SEC这个宏,而这个宏在Windows平台下是1000,而到了Linux平台下就是1000000了。
因此程序正确的写法是:
#include <time.h>
clock_t start, stop;
....
start = clock();
do_something();
stop = clock();
printf("%f", (double)(stop-start)/(double)CLOCKS_PER_SEC) ;
.....
这样才能保证程序在跨平台移植时的正确性。
环境:操作系统-Windows XP SP2 CHS;MS Visual Studio 2005 Team Suite CHS;MS Visual Studio 2008 Team Suite; Intel C++ Compiler 10.1.021。
Intel C++ Compiler只要加入编译参数就可以支持OpenMP,仅仅使用了OpenMP的一些API调用的时候,才需要include omp.h;而MS Vistual Studio支持OpenMP的时候,除了要加入编译参数,源代码还必须include omp.h,否则执行的时候会出错。对于MS VS 2005,是提示“没有找到vcomp.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题”;而对于MS VS 2008 则提示的是“VCOMP90.dll”,其实这些DLL在redist目录下都能找到,就是不知道MS为什么非要加上omp.h后才能去找到。
此外使用集成在MS VS 2008里的Intel C++ Compiler编译代码的话,如果没有omp.h,执行还会出现找不到libgguide40.dll(记得不大清楚了)文件。
也正是如此,才迫使我卸载掉MS VS 2008,重新使用2005。
由 WordPress 所驱动