C语言 clock_gettime() 没有给出正确的输出



我正在尝试计算多线程对矩阵乘法运行时的影响。它依次计算单线程进程、"多处理"进程和多线程进程所花费的时间。我的代码计算时间如下:

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 我们的顺序。(US 代表微秒( 示例输出:

单线程所需的时间:18446744073709499930我们

多进程所需的时间:574915我们

多线程所需的时间:140736432838816我们

多进程加速 : 32086037194558.33 x

多线程加速比 : 131072.98 x

从上面的输出中可以明显看出,它为多进程提供了正确的时间,但没有为其他多线程和单线程提供正确的时间。我无法弄清楚问题所在。

代码无法解释.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;

相关内容

  • 没有找到相关文章

最新更新