2012-05-20 17 views
5

OpenMP aracılığıyla paralel hale getirmek için sıralı kodum var. İlgili pragmaları koyup test ediyorum. Test ederken ana fonksiyonda harcanan zamanı kontrol ederek performans kazancımı yorumluyorum. Garip olan şey, cpu_time() üzerinden hesaplanan geçen süredir ve omp_get_wtime() iki farklı sonuç döndürmektedir. Nedenin ne olduğunu düşünüyorsun?OpenMP zamanı ve saati() iki farklı sonucu hesaplar

cpu_time() işlevi kullanılarak hesaplanan süre, ardışık süreye benzer.

hesaplama

ctime2_ = cpu_time(); 
#ifdef _OPENMP 
ctime2 = omp_get_wtime(); 
#endif 

cpu_time() işlev tanımı

double cpu_time(void) 
{ 
    double value; 
    value = (double) clock()/(double) CLOCKS_PER_SEC; 
    return value; 
} 

Baskı sonucu

printf("%f - %f seconds.\n", ctime2 - ctime1, ctime2_ - ctime1_); 
sona erdikten sonra, hesaplama

ctime1_ = cpu_time(); 
#ifdef _OPENMP 
ctime1 = omp_get_wtime(); 
#endif 

başlamadan önce

Numune sonuç

7.009537 - 11.575277 seconds. 

cevap

11

clock fonksiyon önlemleri cpu sefer, CPU üzerinde aktif olarak geçirdiği sürenin, OMP işlevi yürütme, birbirinden tamamen farklı şeyler esnasında geçti olarak zaman ölçer.

İşleminizin bir yerde beklemede engellenmiş gibi görünüyor.

+5

Windows'da 'clock()' aslında duvar süresini ölçer. – Mysticial

+1

@Mysticial, yine, standart yerine kendi ruh halini takip ediyor gibi görünüyor. Standart şöyle diyor: * Saat işlevi, programın yalnızca programa girişiyle ilgili bir uygulama tanımlı dönemin başlangıcından beri program tarafından kullanılan işlemci süresine en iyi yaklaşımı verir. * –

4

clock() fonksiyonu işlemci zaman değil, duvar kez döner. Bunun yerine, gettimeofday() kullanın. gözlemlemek Ne

6

herhangi paralel bir uygulama için mükemmel geçerli sonucudur - clock() tarafından döndürülen gibi tüm iş parçacığı Başvurunuz çoğunlukla uyur ya bekler eğer hariç omp_get_wtime() ile ölçülen wallclock zaman daha genellikle daha fazladır kombine CPU süresi .