clock_gettime() 没有给出正确的输出[重复]
Posted
技术标签:
【中文标题】clock_gettime() 没有给出正确的输出[重复]【英文标题】:clock_gettime() is not giving correct outputs [duplicate] 【发布时间】:2020-05-06 13:45:34 【问题描述】:我正在尝试计算多线程对矩阵乘法运行时间的影响。它依次计算单线程进程的耗时,然后是“多进程”进程,然后是多线程进程。我的代码计算时间如下:
clock_gettime(CLOCK_MONOTONIC, &start);
for (i = 0; i < arows; i++)
for (j = 0; j < bcols; j++)
if(pthread_create(&tids[i * bcols + j], NULL, &multi_thread_mul, (void*) &t_data[i * bcols + j]))
exit(EXIT_FAILURE);
for (i = 0; i < threads; i++)
pthread_join(tids[i],NULL);
clock_gettime(CLOCK_MONOTONIC, &end);
time_taken = ((double)((end.tv_nsec * 1e-3) - (start.tv_nsec * 1e-3)));
只有嵌套循环部分会为后面的进程瘫痪。 我应该报告以微秒为单位执行的时间。它在 200 * 200、500 * 500 的输入尺寸上运行良好。但是如果输入的尺寸像 2000 * 2000 一样,则给出了错误的时间。我认为它并没有溢出,因为整个执行只用了 5 到 10 秒,即 10^7 我们的顺序。 (我们代表微秒) 示例输出:
单线程耗时:18446744073709499930 us
多进程耗时:574915 us
多线程耗时:140736432838816 us
多进程加速:32086037194558.33 x
多线程加速:131072.98 x
从上面的输出中可以明显看出,它为多进程提供了正确的时间,但没有其他多线程和单线程。我无法找出问题所在。
【问题讨论】:
嗯,你根本不考虑tv_sec
结构成员;看起来不正确
操作系统可能会中断您执行其他任务的进程。
此外,最好除以1000
,而不是乘以1e-3
,这里避免加倍。
【参考方案1】:
代码无法解释.tv_nsec
翻转。 @Ctx
当下面的减法是负数时,分配给一个无符号的 64 位对象会导致一个很大的数字在下面 18446744073709551616 或 264 如 18446744073709499930。
// sometimes this difference is negative due to second roll-over in .tv_sec
time_taken = ((double)((end.tv_nsec * 1e-3) - (start.tv_nsec * 1e-3)));
改为考虑
time_t tdiff = end.tv_sec - start.tv_sec;
assert(tdiff >= 0); // Time should march forward
#define nsec_per_sec 1000000000LL
#define nsec_in_a_usec 1000L
time_taken = (tdiff*nsec_per_sec + end.tv_nsec - start.tv_nsec)/nsec_in_a_usec;
【讨论】:
以上是关于clock_gettime() 没有给出正确的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章