gpt4 book ai didi

c++ - 消除中间特征数组

转载 作者:行者123 更新时间:2023-11-30 01:39:28 24 4
gpt4 key购买 nike

Eigen 是否制作任何中间数组来计算 x,或者 Eigen 只是将值放入 simd 寄存器并进行计算?

一般来说,如何知道Eigen制造了多少中间体?

Eigen 会在循环的每个周期中为中间体分配新的内存吗?

是否有办法确保 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";
}

最佳答案

您可以将 Hook 添加到 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 在其测试套件中某些时候所做的事情:请参阅here for the original definition in the testsuitehere for an example usage in the testsuite .

或者,如果您只关心中间内存分配,您可以尝试宏 EIGEN_RUNTIME_NO_MALLOC -- 这将允许固定大小的表达式计算为临时表达式,因为它们只会在堆栈上分配。

关于c++ - 消除中间特征数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45662877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com