5

我使用了 omp_get_wtime() 但是当我想打印时间时我总是得到 0.00,问题出在哪里?

#define SIZE 500
#define nthreads 10

(...)

void sumTab(int mX[][SIZE], int mY[][SIZE], int mZ[][SIZE]) {
int i,k;
double start = omp_get_wtime();
#pragma omp parallel for schedule(dynamic,3) private(i) num_threads(nthreads)
for(i=0 ; i<SIZE ; i++)
{

   for(k=0 ; k<SIZE ; k++)  
   {

     mZ[i][k]=mX[i][k]+mY[i][k];
     printf("Thread no %d \t  [%d] [%d] result: %d\n", omp_get_thread_num(),i,k, mZ[i][k]); 
     }
}

printf("Time: \t %f \n", omp_get_wtime()-start); 
}
4

8 回答 8

20

确保在文件头中包含 omp.h 库。

#include <omp.h>

double start_time = omp_get_wtime();
#pragma omp parallel [...]
// code
double time = omp_get_wtime() - start_time;

此库将在编译中删除此警告:

warning: implicit declaration of function ‘omp_get_wtime’ [-Wimplicit-function-declaration]

时间会正确显示。

于 2013-12-31T23:08:27.900 回答
3

尝试使用“% g”打印,将其保留为科学记数法。

于 2017-06-13T20:52:11.393 回答
0

声明程序结束的时间,之后你取开始时间和结束时间的差,输出差。这应该可以解决它,就像几个月前我做了类似的事情一样

 THis is what  your code should look like:
 double  dif;
 double start = omp_get_wtime( ); //start the timer
 //beginning of computation
 ..
 ...
//end of computation
    double end = omp_get_wtime();// end the timer
   dif = end - start // stores the difference in dif
  printf("the time of dif is %f", dif);
 //this should point you in the way
于 2013-06-29T05:40:47.987 回答
0

这是因为将 double 转换为 float 时的精度损失

尝试使用格式说明符“%ld”为“%f”的双重插入打印时间。

printf("the time of dif is %lf", dif);

程序执行需要以毫秒为单位的时间,或者可能更少。

于 2018-07-28T10:29:43.110 回答
-1

声明程序结束的时间,之后你取开始时间和结束时间的差,输出差。这应该可以解决它,就像几个月前我做了类似的事情一样

于 2013-06-28T21:16:16.307 回答
-1

您的例程可能太快,无法解决omp_get_wtime. 如果只想测量时间,不关心mZ最终的内容,可以重复测试多次,将最终的次数除以重复次数:

#define REPS 1024
...
...

double acumtime = 0.0;
for (rep = 0; rep < REPS; rep++)
{
  double start = omp_get_wtime();
  #pragma omp parallel for schedule(dynamic,3) private(i) num_threads(nthreads)
  for(i=0 ; i<SIZE ; i++)
  {
    for(k=0 ; k<SIZE ; k++)  
    {
      mZ[i][k]=mX[i][k]+mY[i][k];
      printf("Thread no %d \t  [%d] [%d] result: %d\n", omp_get_thread_num(),i,k, mZ[i][k]); 
    }
  }
  acumtime += omp_get_wtime()-start; 
}
printf ("Elapsed time is: %f\n", acumtime/REPS);

您可能还想抑制printf's并行块内部,因为这可能是减速的严重原因。

于 2015-04-12T16:34:16.113 回答
-1

我遇到了同样的问题,虽然 setprecision 在 c++ 中起到了作用,但您可以在 c 中使用以下代码。为了看到差异,您必须以高精度打印结果。

double exec_time;
double start = omp_get_wtime();
//beginning of computation
...
//end of computation
double end = omp_get_wtime();
exec_time = end - start;
printf("the time difference is %15.15f", exec_time);
于 2015-04-12T16:23:10.700 回答
-1

@mcleod_ideafix 在写到关于 printf 的压制时是对的。您绝对应该从循环中删除对 printf 函数的调用,因为它可能会极大地扭曲结果。请记住,对 printf 的调用将在某个阶段涉及到内核模式的转换,这本身就是 CPU 周期方面的昂贵操作。

于 2015-09-13T15:31:22.343 回答