openMP和SSE,我的程序没有加速

时间:2011-05-13 11:39:41

标签: optimization 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();

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秒钟 - 怎么可能?

1 个答案:

答案 0 :(得分:0)

我在Linux上用gcc尝试了第二个例子。我的程序在Core i3上运行3秒。我想您遇到的问题是您没有正确配置OpenMP。 GCC需要一个选项-fopenmp来启用OpenMP。 VS可能需要类似的配置。