消除中间特征数组
Eliminate Intermediate Eigen Arrays
特征是创建任何中间数组来计算x还是只将值放入simd寄存器并进行计算?
一般来说,如何知道本征制造了多少中间体?
Eigen 会在循环的每个周期中为中间体分配新的内存吗?
有没有办法确保本征不会做任何中间体?它有像"EIGEN_NO_INTERMEDIATE"这样的宏吗?
#include <Eigen/Eigen>
#include <iostream>
using namespace Eigen;
template<typename T>
void fill(T& x) {
for (int i = 0; i < x.size(); ++i) x.data()[i] = i + 1;
}
int main() {
int n = 10; // n is actually about 400
ArrayXXf x(n, n);
ArrayXf y(n);
fill(x);
fill(y);
for (int i = 0; i < 10; ++i) { // many cycles
x = x * ((x.colwise() / y).rowwise() / y.transpose()).exp();
}
std::cout << x << "n";
}
您可以在DenseStorage
构造函数中添加一个钩子,如下所示:
#include <iostream>
static long int nb_temporaries;
inline void on_temporary_creation(long int size) {
if(size!=0) nb_temporaries++;
}
// must be defined before including any Eigen header!
#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { on_temporary_creation(size); }
#define VERIFY_EVALUATION_COUNT(XPR,N) {
nb_temporaries = 0;
XPR;
if(nb_temporaries!=N) { std::cerr << "nb_temporaries == " << nb_temporaries << "n"; }
}
#include <Eigen/Core>
using namespace Eigen;
template<typename T>
void fill(T& x) { for(int i=0; i<x.size(); ++i) x(i)= i+1; }
int main() {
int n=10;
ArrayXXf x(n,n); fill(x);
ArrayXf y(n); fill(y);
for(int i=0; i<10; ++i)
{
VERIFY_EVALUATION_COUNT( x = x * ((x.colwise()/y).rowwise()/y.transpose()).exp(), 0);
}
std::cout << x << 'n';
}
从本质上讲,这就是 Eigen 在某些时候在其测试套件中所做的: 有关测试套件中的原始定义,请参阅此处,有关测试套件中的示例用法,请参阅此处。
或者,如果您只关心中间内存分配,则可以尝试宏EIGEN_RUNTIME_NO_MALLOC
- 这将允许固定大小的表达式计算为临时表达式,因为它们只会在堆栈上分配。
相关文章:
- 具有 2 个分量的数组的特征映射到 3 的向量
- 特征 3 方形数组除以列数组
- 计算数组的特征值/向量,而不是使用特征 3 计算矩阵
- 特征获取索引数组,其中向量中的值为真(不需要循环)
- 消除中间特征数组
- 特征:从数组类型中获取标量类型是否记录?
- 来自 2D 数组的特征图
- C++ char 数组特征:为什么字符串在数组结束之前停止?
- 将特征数组行保存在变量中
- 特征:累积可变大小的数组
- 为什么我不能将 op 结果乘以常量特征张量数组
- C++特征动态大小矩阵的数组
- 蓝牙LE:设置字节数组的特征会发送错误的值
- 特征:将数组映射到矩阵大小未知的矩阵
- 将特征向量复制到 C 数组
- 如何在特征中对二维数组的列执行简单的算术运算
- 如何将数据从数组复制到C++特征矩阵或向量
- 将数组复制C++作为特征矩阵的向量
- 在带有单元格数组的C 特征矩阵和MATLAB MXARRAY之间传递数据
- 数组特征导致模板参数推断失败