我使用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的值时,该问题稳定地发生。
有没有人可以解释它?
答案 0 :(得分:0)
这是因为您的矩阵包含denormal numbers,它们处理CPU的速度很慢。您应该确保使用合理的单位,以便将它们视为零,然后启用齐居为零(FTZ)和非正常为零的标志(DAZ),例如使用快速数学模式您的编译器或运行时,请参阅this SO question。