【发布时间】:2017-02-04 05:54:22
【问题描述】:
我正在编写一些 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()得到的结果:
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;
这是有原因的吗?使用这两个功能时可能会导致什么不同?我试图更好地理解这两个函数的性质。
【问题讨论】:
-
我还分别使用两个时间函数运行了代码,然后也注意到了时间差。
-
第1步:测试后,打印读取的值。
-
只要使用
omp_get_wtime()! -
发布代码报告差异的方式会有所帮助。尤其是在多长时间内。
-
请发布minimal reproducible example 以及该代码的具体结果,而不仅仅是您的摘要。
标签: c time parallel-processing openmp gettimeofday