2011-05-13 114 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