2013-05-27 1 views
4

Я использовал omp_get_wtime(), но когда я хочу распечатать время, я всегда получаю 0.00, где проблема?C OMP 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); 
} 
+0

Возможно, точность 'omp_get_wtime' недостаточно высока? – thejh

+0

Какие команды вы использовали для компиляции и запуска этой программы? – Chris

+0

Я использую команду make с OPT = -O3 -fopenmp – kxyz

ответ

-1

Объявите время, когда программа заканчивается, после чего вы берете разницу между временем начала и окончания времени, выходной разница. это должно решить его, так как я сделал что-то подобное несколько месяцев назад.

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 
12

Убедитесь, что вы включили 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] 

И время покажет правильно.

-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); 
-1

Ваша процедура может быть слишком быстрым для разрешения omp_get_wtime. Если вы хотите, чтобы измерить время и не заботиться о конечном содержании М.З., вы можете повторить тест несколько раз и разделить конечное число на количестве повторений:

#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 внутри параллельного блока, поскольку это может быть серьезной причиной замедления.

-1

@mcleod_ideafix был прав, когда писал о подавлении printf. Вы должны обязательно удалить вызов функции printf из цикла, поскольку это может сильно исказить результат. Имейте в виду, что вызов printf будет на какой-то стадии включать переход к режиму ядра, и это само по себе является дорогостоящей операцией с точки зрения циклов процессора.

2

Попробуйте напечатать «% g», который оставляет его как научное обозначение.