我已将我的代码中的Eigen :: Tensor SetZero()调用更改为对张量数据的memset调用,并观察到更好的性能。在VS 2016中构建(默认情况下应启用SSE2支持)。为什么会这样?我原以为Eigen :: Tensor是高度优化的。
#include <unsupported/Eigen/CXX11/Tensor>
#include <iostream>
#include <ctime>
#define MyLayoutType Eigen::RowMajor
#define Tf3 Eigen::Tensor<float, 3, MyLayoutType>
clock_t begin = clock();
Tf3 tensor(1000, 500, 20);
for (size_t i = 0; i < 100; i++)
{
tensor.setRandom();
memset(tensor.data(), 0, tensor.size() * sizeof(float));
// VS:
//tensor.setZero();
}
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << "-----------------------" << endl;
cout << "Total time elapsed: " << elapsed_secs << "
secs" << endl;
cout << tensor(0, 0, 0);
在我的环境中,我在avg上获得了2.1的memset,在setZero上获得了2.3。并且setRandom操作比memset要多得多。如果我注释掉tensor.setRandom()我得到0.4的memset和0.5得到setZero.IN真正的代码性能差异更大。