- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一些 C 代码,这些代码实现三重嵌套 for 循环以计算矩阵-矩阵乘法,同时使用 OpenMP 对其进行并行化。我试图准确地测量从 for 循环开始到结束所花费的时间。到目前为止,我一直在使用 gettimeofday(),但我注意到有时感觉它并没有准确记录 for 循环执行所花费的时间。好像是在说比实际花费的时间要长。
原代码如下:
struct timeval start end;
double elapsed;
gettimeofday(&start, NULL);
#pragma omp parallel for num_threads(threads) private(i, j, k)
for(...)
{
...
for(...)
{
...
for(...)
{
...
}
}
}
gettimeofday(&end, NULL);
elapsed = (end.tv_sec+1E-6*end.tv_usec) - (start.tv_sec+1E-6*start.tv_usec)
下面是使用 clock_gettime() 的相同代码:
struct timespec start1, finish1;
double elapsed1;
clock_gettime(CLOCK_MONOTONIC, &start1);
#pragma omp parallel for num_threads(threads) private(i, j, k)
for(...)
{
...
for(...)
{
...
for(...)
{
...
}
}
}
clock_gettime(CLOCK_MONOTONIC, &finish1);
elapsed1 = (finish1.tv_sec - start1.tv_sec);
elapsed1 += (finish1.tv_nsec - start1.tv_nsec)/1000000000.0;
循环需要 3-4 秒才能完成,我尝试同时使用两个时间测量值,使用 gettimeofday() 的结果几乎总是比 clock_gettime() 的结果长,有时比 clock_gettime() 的结果长一秒以上我使用 clock_gettime() 得到的结果:
struct timespec start1, finish1;
double elapsed1;
struct timeval start end;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start1);
gettimeofday(&start, NULL);
#pragma omp parallel for num_threads(threads) private(i, j, k)
for(...)
{
...
for(...)
{
...
for(...)
{
...
}
}
}
gettimeofday(&end, NULL);
clock_gettime(CLOCK_MONOTONIC, &finish1);
elapsed = (end.tv_sec+1E-6*end.tv_usec) - (start.tv_sec+1E-6*start.tv_usec)
elapsed1 = (finish1.tv_sec - start1.tv_sec);
elapsed1 += (finish1.tv_nsec - start1.tv_nsec)/1000000000.0;
这是有原因的吗?使用这两个功能时可能会造成什么不同?我试图更好地理解这两个函数的性质。
最佳答案
elapsed = (end.tv_sec+1E-6*end.tv_usec) - (start.tv_sec+1E-6*start.tv_usec)
在减去类似的值时容易丢失精度都很大。
使用 elapsed = (end.tv_sec - start.tv_sec) - (start.tv_usec- end.tv_usec)/1E6
。这类似于 OP 的第 2 和第 3 代码,但不是第一个。
保持公平,以一致的顺序获取时间以消除偏见。
clock_gettime(CLOCK_MONOTONIC, &start1);
gettimeofday(&start, NULL);
...
// gettimeofday(&end, NULL);
// clock_gettime(CLOCK_MONOTONIC, &finish1);
clock_gettime(CLOCK_MONOTONIC, &finish1);
gettimeofday(&end, NULL);
次要:第三个非常细微的改进有助于减少一点位(0.5 微秒)的不一致性,它是在滴答变化时开始测试。但注意@Dietrich Epp comment进行替代改进。
gettimeofday(&t, NULL);
do {
gettimeofday(&start, NULL);
} while (start == t);
或者,使用宽整数数学来避免精度问题
long long elapsed_ns = (1LL*finish1.tv_sec - start1.tv_sec)*1000000000LL +
finish1.tv_nsec - start1.tv_nsec;
关于clock_gettime() 对比。 gettimeofday() 用于测量 OpenMP 执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39710442/
当我尝试获取 ns 时间时,我在内核为 2.6.18 的 Linux 中遇到了问题,如下所示: #include #include #include int main(void) { s
我在我的 Mac 上用 C 来做基准测试。此处的代码可以编译并运行,但输出中会出现大约 1Hz 的故障。该程序“应该”每 2 毫秒中断一次,并报告上次中断时间的数据。默认设置是打印以下内容到终端 ev
我在 Linux 2.6 上使用 clock_gettime()(来自 time.h)来控制线程循环中的计时。我需要在 +/- 5mS 时间范围内有 500mS。它似乎给了我 500 毫秒,然后开始漂
我有一个在linux上运行的非常简单的代码,如下所示: struct timespec SysTime_Test; #define BILLION 1000000000L SysTime_Test.
我正在运行一个进行长时间计算的 Haskell 程序。经过一些分析和跟踪后,我注意到以下内容: $ /usr/bin/time -v ./hl test.hl 9000045000050000 Com
我正在尝试获取 Ubuntu 上进程消耗的 CPU 时间。据我所知,有两个函数可以完成这项工作:getrusage() 和 clock_gettime(CLOCK_PROCESS_CPUTIME_ID
我试图测量一段代码的时间,并注意到当我从我的编辑器 QtCreator 中运行程序时,与我从 gnome 终端中启动的 bash shell 运行它时相比,时间快了大约 50ns。我使用 Ubuntu
我在多线程代码中使用 timespec 结构 - 一个线程调用 clock_gettime()填充全局 timespec 结构,另一个 - 读取该结构。问题:是clock_gettime()调用原子还
我正在编写一个简单的程序,它检查耗时是否超过 1 秒。我使用clock_gettime()获取开始时间,然后调用sleep(5),获取新时间并检查差异是否大于1;我睡了 5 秒,那么它应该大于 5,但
我正在尝试使用 clock_gettime 函数获取以下代码的运行时间。但是,当我运行代码时,每次运行时我都会收到 0.0000 的时间。我也分别输出了开始和停止时间,我收到了完全相同的答案。 str
当使用下面的示例代码时,我认为 tv_nsec 值是循环的,因为它只是一个long; #include using namespace std; #include int main(int arg
我阅读了以下手册: http://linux.die.net/man/3/clock_gettime 然后我写了下面的代码: #include int main() { struct tim
Linux 中的 clock_gettime 函数在调用以测量给定代码段的运行时间时,内部使用哪个系统硬件计时器将纳秒级分辨率返回给用户代码? 最佳答案 现代 CPU 以几 GHz 时钟频率运行。 1
clock_gettime 不再适用于 MacOS Sierra。很确定在 Xcode 8 出来之前我已经正确地编译了这个。我真的很困惑如何才能让它正确编译。 #include #include
我正在尝试使用 clock_gettime 函数,但无法弄清楚所需的 header 是什么(或者如果这不是 header 的问题,我做错了什么)。这是我的代码: #include #include
我想用 clock_gettime 测量挂钟时间,但每次运行我的代码时,它都显示 0。这是为什么? (我希望我的结果以毫秒为单位。) #include #include #include #in
我正在编写一个简单的程序,用于检查耗时是否超过 1 秒。我使用 clock_gettime() 获取开始时间,然后调用 sleep(5),获取新时间并检查差异是否大于 1;我睡了 5 秒,那么它应该大
我在我的 C++ 程序中使用 clock_gettime() 来获取当前时间。但是,返回值是自 UTC 纪元以来的秒数。在夏令时期间,当时间偏移一小时时,此代码在我的时区可能会搞砸。 系统本身有 NT
我想要以微秒为单位的当前系统时间,所以我使用 clock_gettime 编写了一个程序,但它有时会返回负值。有人可以帮我解决这个问题吗? int main(void) { struct ti
我正在尝试用这个类分析一个程序: namespace smtx{ class CPerformance_clock { timespec t1; tim
我是一名优秀的程序员,十分优秀!