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

-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

あなたのルーチンは の解決には速すぎる可能性があります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また、これは速度低下の深刻な原因になる可能性があるため、parallel ブロッ​​ク内で抑制したい場合もあります。

于 2015-04-12T16:34:16.113 に答える