【发布时间】:2019-04-17 09:32:36
【问题描述】:
我正在尝试使用 OpenMP 来加速我的神经网络计算代码。当我使用 Visual Studio 2017 时,我需要在属性表中启用 OpenMP 支持。但是,在我这样做之后,即使我没有在代码中包含任何 #pragma omp,代码的某些部分也会减慢大约 5 倍。
我已经隔离了这些部分,发现这个特定的功能导致了问题:
void foo(Eigen::Matrix<float,3,Eigen::Dynamic> inputPts)
{
std::vector<Eigen::MatrixXf> activation;
activation.reserve(layerNo);
activation.push_back(inputPts);
int inputNo = inputPts.cols();
for (int i = 0; i < layerNo - 2; i++)
activation.push_back(((weights[i]*activation[i]).colwise()+bias[i]).array().tanh());
activation.push_back(((weights[layerNo - 2]*activation[layerNo - 2]).colwise()+bias[layerNo - 2]));
val = activation[layerNo - 1]/scalingFactor;
std::vector<Eigen::MatrixXf> delta;
delta.reserve(layerNo);
Eigen::Matrix<float, 1, Eigen::Dynamic> seed;
seed.setOnes(1, inputNo);
delta.push_back(seed);
for (int i = layerNo - 2; i >= 1; i--)
{
Eigen::Matrix<float,Eigen::Dynamic,Eigen::Dynamic>
d_temp = weights[i].transpose()*delta[layerNo - 2 - i],
d_temp2 = 1 - activation[i].array().square(),
deltaLayer = d_temp.cwiseProduct(d_temp2);
delta.push_back(deltaLayer);
}
grad = weights[0].transpose()*delta[layerNo - 2];
}
两个 for 循环显着减慢速度(从 ~3ms 到 ~20ms)。奇怪的是,虽然这个函数在程序中被调用了很多次,但只有一部分受到影响。
我已经包含了头文件<omp.h>。我不确定这是否是由于到处都在使用的 Eigen 库。我尝试按照official site 中的建议定义EIGEN_DONT_PARALLELIZE 并调用Eigen::initParallel(),但它没有帮助。
奇怪的是我根本没有包含任何parallel pragma,处理 OpenMP 函数不应该有任何开销吗?为什么它还在减速?
【问题讨论】:
标签: visual-studio-2017 openmp eigen