c++ - 为什么这个 OpenMP 程序比单线程程序慢?

标签 c++ multithreading optimization openmp single-threaded

请看这段代码。

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

g++ -lrt -O2 main.cpp -o nnlv2

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

g++ -lrt -fopenmp -O2 main_openmp.cpp -o nnlv2_openmp

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

一些测试:

单线程:

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);
}

关于c++ - 为什么这个 OpenMP 程序比单线程程序慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6671448/

相关文章:

c# - BeginInvoke回调函数

c++ - C++中的高速缓冲

javascript - 创建一个 Jquery 对象的对象

c++ - 优化调用函数指针数组

c++ - cpp 中有关 .idl 文件的信息

c++ - 为什么 std::lerp 不适用于任何已实现所需操作的类型?

android - 如何为 android 构建和安装 opencv+contrib .so 库

c++ - 哪些编译器选项用于在 Visual Studio 中编译 C++ STL 类/函数?

c++ - Matlab中的USRPs并行控制

mysql - 为什么 MySQL 不使用该子查询的索引?