请看这段代码。

单线程程序:http://pastebin.com/KAx4RmSJ。编译:



带有openMP的多线程:http://pastebin.com/fbe4gZSn
编译:



我在双核系统上进行了测试(因此我们有两个并行运行的线程)。但是多线程版本比单线程版本慢(并且显示时间不稳定,请尝试运行几次)。怎么了?我在哪里弄错了?

一些测试:

单线程:

Layers Neurons Inputs --- Time (ns)

10 200 200 --- 1898983

10 500 500 --- 11009094

10 1000 1000 --- 48116913

多线程:
Layers Neurons Inputs --- Time (ns)

10 200 200 --- 2518262

10 500 500 --- 13861504

10 1000 1000 --- 53446849

我不明白怎么了。

最佳答案

您的目标是学习OpenMP还是使程序更快?如果是后者,那么编写乘加代码,减少通过次数并合并SIMD会更值得。

步骤1:合并循环并使用乘法加法:

// remove the variable 'temp' completely
for(int i=0;i<LAYERS;i++)
{
  for(int j=0;j<NEURONS;j++)
  {
    outputs[j] = 0;

    for(int k=0,l=0;l<INPUTS;l++,k++)
    {
      outputs[j] += inputs[l] * weights[i][k];
    }

    outputs[j] = sigmoid(outputs[j]);
  }

  std::swap(inputs, outputs);
}

07-24 09:44
查看更多