C OMP omp_get_wtime () Час 0.00 вяртання

Я выкарыстаў 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
4
Я выкарыстоўваю зрабіць каманду з OPT = -O3 -fopenmp
дададзена аўтар kxyz, крыніца
Я выкарыстоўваю зрабіць каманду з OPT = -O3 -fopenmp
дададзена аўтар kxyz, крыніца
Якія каманды вы выкарыстоўвалі для кампіляцыі і запуску гэтай праграмы?
дададзена аўтар Chris, крыніца
Якія каманды вы выкарыстоўвалі для кампіляцыі і запуску гэтай праграмы?
дададзена аўтар Chris, крыніца
можа быць, дакладнасць omp_get_wtime не дастаткова высокі?
дададзена аўтар thejh, крыніца
можа быць, дакладнасць omp_get_wtime не дастаткова высокі?
дададзена аўтар thejh, крыніца

16 адказы

Пераканайцеся, што вы ўключылі omp.h бібліятэкі ў загалоўку файла.

#include 

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]

І час пакажа правільна.

12
дададзена

Пераканайцеся, што вы ўключылі omp.h бібліятэкі ў загалоўку файла.

#include 

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]

І час пакажа правільна.

12
дададзена

Паспрабуйце выканаць пячатку з «% г», што пакідае яе ў якасці навуковай натацыі.

2
дададзена

Паспрабуйце выканаць пячатку з «% г», што пакідае яе ў якасці навуковай натацыі.

2
дададзена

Ваша працэдура можа быць занадта хуткім для дазволу 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

Вы таксама можаце здушыць PRINTF-х ўнутры паралельнага блока, так як гэта можа быць сур'ёзнай прычынай замаруджвання.

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

Вы таксама можаце здушыць PRINTF-х ўнутры паралельнага блока, так як гэта можа быць сур'ёзнай прычынай замаруджвання.

1
дададзена

@mcleod_ideafix меў рацыю, калі ён пісаў пра падаўленні Printf. Вы абавязкова павінны выдаліць выклік функцыі PRINTF ўнутры цыклу, паколькі гэта можа прывесці да скажэння выніку моцна. Майце на ўвазе, што называюць у Printf будзе на нейкім этапе ўключаюць пераход у рэжым ядра, і гэта само па сабе з'яўляецца дарагой аперацыяй з пункту гледжання цыклаў цэнтральнага працэсара.

1
дададзена

@mcleod_ideafix меў рацыю, калі ён пісаў пра падаўленні Printf. Вы абавязкова павінны выдаліць выклік функцыі PRINTF ўнутры цыклу, паколькі гэта можа прывесці да скажэння выніку моцна. Майце на ўвазе, што называюць у Printf будзе на нейкім этапе ўключаюць пераход у рэжым ядра, і гэта само па сабе з'яўляецца дарагой аперацыяй з пункту гледжання цыклаў цэнтральнага працэсара.

1
дададзена

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

1
дададзена

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

1
дададзена

У мяне была такая ж праблема і ў той час як setprecision зрабіў трук ў 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
дададзена

У мяне была такая ж праблема і ў той час як setprecision зрабіў трук ў 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
дададзена

Гэта адбываецца з-за <�моцны> дакладнасць страты ў пераўтварэнні двайны плаваць.

Паспрабуйце надрукаваць час з спецификатор фармату "% Л.Д." для <�моцны> двайны InstEd з "% F".

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

Выкананне праграмы займае шмат часу ў мілісекундах, або, можа быць менш, чым гэта.

0
дададзена

Гэта адбываецца з-за <�моцны> дакладнасць страты ў пераўтварэнні двайны плаваць.

Паспрабуйце надрукаваць час з спецификатор фармату "% Л.Д." для <�моцны> двайны InstEd з "% F".

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

Выкананне праграмы займае шмат часу ў мілісекундах, або, можа быць менш, чым гэта.

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
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
0
дададзена