为什么特征中相同尺寸矩阵的内积成本差异很大?

时间:2017-06-28 06:52:36

标签: eigen

我使用Eigen计算两个矩阵的内积,第一个是A =(B C).eval(),第二个是D =(E F).eval()。这里B,C,E,F具有相同的尺寸(1500 * 1500)但具有不同的值。我发现第一个花费大约200毫秒,而第二个花费大约6000毫秒,我不知道为什么会这样。

#include <iostream>
#include <time.h>

#include "Eigen/Dense"

int main() {
    clock_t start, stop;

    Eigen::MatrixXf mat_a(1200, 1500);
    Eigen::MatrixXf mat_b(1500, 1500);
    Eigen::MatrixXf mat_r(1000, 1300);
    int i, j;
    float c = 0;
    for (i = 0; i < 1200; i++) {
        for (j = 0; j < 1500; j++) {
            mat_a(i, j) = (float)(c/3 * 1.0e-40);
            //if (i % 2 == 0 && j % 2 == 0) mat_a(i, j);
            c++;
        }
    }
    //std::cout << mat_a.row(0) << std::endl;
    c = 100;
    for (i = 0; i < 1500; i++) {
        for (j = 0; j < 1500; j++) {
            mat_b(i, j) = (float)(c/3 * 0.5e-10);
            c++;
        }
    }
    //std::cout << mat_b.row(0) << std::endl;

    start = clock();
    mat_r = mat_a * mat_b;
    stop = clock();
    std::cout << stop - start << std::endl;
    getchar();
    return 0;
}

如上面的示例代码所示。我发现这是由矩阵的值引起的,当mat_a具有关于e-40的值并且mat_b具有关于e-10的值时,该问题稳定地发生。

有没有人可以解释它?

1 个答案:

答案 0 :(得分:0)

这是因为您的矩阵包含denormal numbers,它们处理CPU的速度很慢。您应该确保使用合理的单位,以便将它们视为零,然后启用齐居为零(FTZ)和非正常为零的标志(DAZ),例如使用快速数学模式您的编译器或运行时,请参阅this SO question