Я пытаюсь использовать OpenMP для ускорения моих кодов для вычислений нейронной сети.Поскольку я использую Visual Studio 2017, мне нужно включить поддержку OpenMP в листах свойств.Однако после того, как я это сделал, некоторая часть кода замедляется примерно в 5 раз, хотя я не включил в код #pragma omp
.
Я выделил разделыи обнаружил, что именно эта функция вызывает проблему:
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 - это те, которые значительно замедляются (от ~ 3 мс до ~ 20 мс).Как ни странно, хотя эта функция вызывается в программе много раз, это затрагивает только некоторые из них.
Я включил заголовочный файл <omp.h>
.Я не уверен, происходит ли это из-за библиотеки Eigen, которая используется везде.Я попытался определить EIGEN_DONT_PARALLELIZE
и позвонить на Eigen::initParallel()
, как это было предложено на официальном сайте , но это не помогло.
Странно то, что я даже не включил parallel pragma
ввсе, не должно быть никаких накладных расходов для обработки функций OpenMP?Почему это все еще замедляется?