这是我的代码的一部分并行运行:
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();
epochs = 100
我有AMD athlon X2 5000+
当我在没有omp指令的情况下启动此代码时,时间是相同的...
当我在运行两个程序时查看任务管理器/性能(有/没有omp)
在这两种情况下都使用了2个内核......所以似乎VS(VS 2008)以某种方式优化了像omp这样的代码
并行循环内的代码使用SSE指令......
我想知道可能在多核过程中只有一个SSE单元,但它会是愚蠢的......
所以也许某些人可以告诉我我做错了什么?
我知道这取决于我在循环中的代码,但如果内部的代码是并行的,那么它必须加速......
好的,我肯定做错了什么 - 看看这段代码:
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 * 1000ms) 使用omp它应该睡不到10秒,因为2个线程可以一次睡觉吗? 但它再次睡10秒钟 - 怎么可能?
答案 0 :(得分:0)
我在Linux上用gcc尝试了第二个例子。我的程序在Core i3上运行3秒。我想您遇到的问题是您没有正确配置OpenMP。 GCC需要一个选项-fopenmp来启用OpenMP。 VS可能需要类似的配置。