我如何使用Eigen提高我的表现? (包括示例代码)

问题描述 投票:0回答:1

我的矩阵数学在以下函数中是否效率过低?我在Visual Studio中启用了优化功能,并以64位发布模式进行构建。我正在通过此处喂入相当大的矩阵(750X350),但是我的表现似乎仍然很慢。

void NeuralNetwork::backward(Eigen::MatrixXf back, float learningRate)
{
    std::vector<Eigen::MatrixXf> dedw;
    std::vector<Eigen::MatrixXf> delta;

    int nLayers = layers.size();

    int dIt = 0;
    for (int i = nLayers -1;i > 0; i=i-1)
    {
        Eigen::MatrixXf deltai;
        logger->LogVerbose("--------","Back", i,"---------");
        if (i == (nLayers - 1))
        {
            deltai.noalias() = back.cwiseProduct(dSigmoid(X[i]));
            delta.push_back(deltai);
            dIt++;

        }
        else
        {
            logger->LogVerbose("W", i);
            deltai.noalias() = (W[i].transpose() * delta[dIt - 1]).cwiseProduct(dSigmoid(X[i]));
            delta.push_back(deltai);
            dIt++;
        }
        Eigen::MatrixXf dedwi;
        dedwi.noalias() = delta[dIt - 1] * X[i - 1].transpose();
        dedw.push_back(dedwi);
        logger->LogVerbose("dedw", dIt - 1, dedw[dIt - 1]);

        Eigen::MatrixXf WiNew;
        WiNew.noalias() = W[i - 1] - learningRate * dedw[dIt - 1];
        W[i-1] = WiNew;
        logger->LogVerbose("W", i - 1);
        logger->LogVerbose(W[i - 1]);

        Eigen::MatrixXf BiNew;
        BiNew.noalias() = B[i - 1] - learningRate * delta[dIt - 1];
        B[i-1] = BiNew;
        logger->LogVerbose("B", i - 1);
        logger->LogVerbose(B[i - 1]);


    }
}
c++ eigen
1个回答
2
投票

避免在性能敏感的代码中使用内存密集型操作。

  1. 切勿通过值传递“大参数”。

例如

void NeuralNetwork::backward(Eigen::MatrixXf back, float learningRate)

应该是

void NeuralNetwork::backward(const Eigen::MatrixXf& back, float learningRate)

这避免了在函数中一次又一次地复制构造参数。

  1. 避免在函数内部复制。您将临时的deltadedw向量矩阵推入。您可能想要这样移动它们:delta.push_back(std::move(deltai));
  2. 重新使用分配的内存。您可能可以重用deltadedw工作空间向量。即使最小化不必要的分配-分配。如果您不需要上一个调用中的元素,只需清除它们即可。

这些将是要做的第一件事。最后-profile

我将使用perf record分析程序中的瓶颈。挤出最大性能的最佳方法是修复最大的瓶颈。在这一点上,您不知道最大的瓶颈在哪里。因此,个人资料,个人资料,个人资料。

© www.soinside.com 2019 - 2024. All rights reserved.