我正在尝试测量在不同条件下执行一段代码所花费的时间。我提供了一个数字n,程序将打印出执行一次循环所需的时间n次。但是,与#pragma指令一起使用时,显示的时间似乎不正确。
我尝试使用和不使用#pragma指令。
#include <threads.h>
#include <stdio.h>
#include <time.h>
#include <omp.h>
void loopy(int);
void runloop(int);
int main(int argc, char *argv[]){
int num = atoi(argv[1]);
printf("The number entered is :: %d\n",num);
displayTimeTaken(loopy,num);
}
void loopy(int num){
int i;
#pragma omp parallel for
for(i=0;i<num;i++)for(int j=0;j<num;j++);
}
void displayTimeTaken(void *function(), int num){
clock_t start, end;
double cpu_time_used;
start = clock();
function(num);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Time taken is :: %10fs for the number %d\n ", cpu_time_used,num);
}
我的CPU中输入100000的结果是:: (没有并行性)
花费的时间是:: 24.632967s(数字为100000
)
我的时钟中记录的实时时间也是24秒。
到目前为止很好。
(具有并行性)
花费的时间是:: 24.408596s(数字为100000
)
但是实际花费了大约8秒! 我多次检查了代码,但对我来说,杂指令如何影响显示的时间没有意义。我运行了gdb,发现该程序正在启动3个线程。
The number entered is :: 100000
[New Thread 0x7ffff7d79700 (LWP 8761)]
[New Thread 0x7ffff7578700 (LWP 8762)]
[New Thread 0x7ffff6d77700 (LWP 8763)]
Time taken is :: 24.177702s for the number 100000
[Thread 0x7ffff6d77700 (LWP 8763) exited]
[Thread 0x7ffff7578700 (LWP 8762) exited]
[Thread 0x7ffff7d79700 (LWP 8761) exited]
[Inferior 1 (process 8760) exited normally]
因此,我的第一个理论是以某种方式将各个线程所花费的时间加起来。但是,对我来说,这毫无意义。
如果有人可以对此有所了解,我会很高兴。
答案 0 :(得分:0)
clock()
返回该进程使用的大约处理器时间。它可以大于或小于用于执行的实时时间(有时称为“挂墙时间”)。
您也可以使用time
函数,但这通常只有一秒钟的分辨率。
对于更高分辨率的壁钟,您需要使用特定于系统的内容(例如,在提供POSIX标头的系统上为clock_gettime
,在Windows上为GetTickCount
)。