2011-05-13 32 views
0

這裏是我的代碼的一部分平行延伸:OpenMP和SSE,我的程序不加快

timer.Start(); 
     for(int i = 0; i < params.epochs; ++i) 
     { 
      #pragma omp for 
      for(int j = 0; j < min_net; ++j) 
      { 
       std::pair<CVectorSSE,CVectorSSE>& sample = data_set[j]; 
       nets[j]->Approximate(sample.first,net_outputs[j]); 
       out_gradients[j].SetDifference(net_outputs[j],sample.second); 
       nets[j]->BackPropagateGradient(out_gradients[j],net_gradients[j]); 
      } 

     } 
     timer.Stop(); 

曆元= 100
我的AMD Athlon X2 5000+
當我啓動這個代碼沒有omp指令的時間是相同的... 而當我看着任務管理器/性能運行時兩個程序(使用/不使用omp) 在兩種情況下使用2個核心...因此,似乎VS(VS 2008 )以某種方式優化代碼,如omp ???
並行循環中的代碼使用SSE指令... 我想知道,也許在多核處理器只有一個SSE單元,但它會是愚蠢的...所以也許some1可以告訴我我做錯了什麼? 我知道,這取決於我的代碼內循環,但如果這段代碼裏面平行那麼它必須加快...

好吧,我definitly做錯了 - 看看這個代碼:

time_t start; 
time_t stop; 

start = time(NULL); 
#pragma omp for 
for(int i = 0; i < 10; ++i) 
{ 
    Sleep(1000); 
} 
stop = time(NULL); 

cout<<difftime(stop,start)<<endl; 

沒有omp它應該睡10秒(10 * 1000毫秒) 與omp它應該睡眠不到10秒,因爲2個線程可以睡在一次嗎? 但它再次睡10秒 - 它怎麼可能?

+1

你應該**代碼**並查看在哪裏花費時間 - 否則你只是猜測你的性能問題在哪裏 – 2011-05-13 12:07:24

回答

0

我在Linux上用gcc嘗試過第二個例子。我的程序在Core i3上運行3秒。我想你遇到的問題是你沒有正確配置OpenMP。 GCC需要一個選項-fopenmp來啓用OpenMP。對於VS來說可能需要類似的配置。

+0

是的我在VS(project/properties/language/useopenmp)中啓用了openMP,也該程序加載vcomp90.dll這是openmp DLL ... – user606521 2011-05-13 12:12:03

+0

好吧我現在知道 - 編譯omp for doestn工作 - 我必須鍵入編譯指示omp並行... ... – user606521 2011-05-13 13:04:47