我遇到了以下问题:我必须测量程序需要执行的时间。该程序的标量版本可以正常使用下面的代码,但是当使用OpenMP时,它可以在我的PC上运行,但不能在我应该使用的资源上运行。 事实上:
那是我的电脑(一切正常) - 用visual studio编译 我必须使用的资源(我认为Linux,用gcc编译):
我的观点是,它会添加所有刻度,大约相同的数量,并将它们除以单个核心的刻度率。我的问题是如何解决这个问题,如果有更好的方法可以在控制台上观看时间。
clock_t start, stop;
double t = 0.0;
assert((start = clock()) != -1);
... code running
t = (double)(stop - start) / CLOCKS_PER_SEC;
printf("Run time: %f\n", t);
答案 0 :(得分:4)
增加Mark的答案:不要使用clock()
clock()
是旧计算机时代的一个可怕的误解,他的实际实现在平台之间差异很大。看哪:
clock()
返回调用进程使用的处理器时间(不是挂钟时间!),即每个线程处理器时间的总和; clock()
返回调用进程使用的处理器时间(又不是挂钟时间)及其所有已终止的子进程{已执行{1}},wait
或system
; pclose
; clock()
返回挂钟时间(不是处理器时间)。在上面的描述中,处理器时间通常表示用户和系统时间的总和。这可能小于挂钟(实际)时间,例如,如果进程休眠或等待文件IO或网络传输,或者它可能超过挂钟时间,例如当进程有多个线程时,主动使用CPU。
永远不要使用clock()
。使用clock()
- 它存在于OpenMP支持的所有平台上,并始终返回挂钟时间。
答案 1 :(得分:3)
将我之前的评论转换为为声誉做任何事情的精神答案......
使用对omp_get_wtime
的两次调用来获取代码中两点之间的挂钟时间(以秒为单位)。请注意,在每个线程上单独测量时间,线程之间没有时钟同步。
答案 2 :(得分:0)
您的问题是clock
。根据C标准,它测量CPU为您的过程传递的时间,而不是挂钟时间。所以这就是linux所做的(通常他们坚持标准)然后顺序程序或并行程序的总CPU时间是相同的,应该是这样。
Windows操作系统与此不同,因为clock
是挂钟时间。
因此请使用其他时间测量功能。对于标准C,这将是time
或者如果您需要使用新的C11标准更精确,您可以使用timespec_get
,对于OpenMP,还有其他可能性已经提到过。