请看一下这段代码。
单线程程序: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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)