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() 没有给出正确的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Linux上确定clock_gettime分辨率的正确方法

为啥 QDatastream 没有给出正确的输出

NORMDIST 函数没有给出正确的输出

Hive RegexSerDe 没有给出正确的输出

Scapy ARP函数在运行时没有给出正确的输出

当没有列增加时,PIVOT 给出不正确的输出