Eigen3 的自动向量化和函数间传递
Eigen3's autovectorization and pass between functions
当一个 class A 传递一个 Eigen::Array 成员的列,另一个 class B 拿走该列,然后用 B 的 Eigen::Array?
示例:
#include <Eigen/Dense>
class A_interface {
public:
template <typename T>
void div_by(const T& rhs);
const auto col(const int col_id) const;
};
enum A_implementation { test };
template <A_implementation A_t> class A;
template <>
class A<test> : public A_interface{
public:
A(const int n_rows, const int n_cols)
: _n_rows(n_rows), _n_cols(n_cols),
_data(n_rows, n_cols) {}
const auto col(const int col_id) const {
return _data.col(col_id);
}
template <typename T>
void div_by(const T& rhs) {
for (int i = 0; i < _n_cols; ++i) {
_data.col(i) /= rhs.col(i);
}
}
private:
const int _n_rows;
const int _n_cols;
Eigen::ArrayXXf _data;
template <A_implementation A_t> friend class A;
};
int main() {
A<test> a(10,2);
A<test> b(10,2);
a.div_by(b);
}
我想这样做是因为并非 A 的所有实现都使用 Eigen::Array。
在这种情况下,div_by
方法中的双循环是由 Eigen3 或编译器矢量化的吗?
是 div_by
如果两个数组都存储 column-wise(Eigen 中的默认值),将被矢量化。但是你为什么要在列上循环? _data/=rhs
呢?为什么要存储 _n_rows,n_cols
?信息已经在 _data
.
中
当一个 class A 传递一个 Eigen::Array 成员的列,另一个 class B 拿走该列,然后用 B 的 Eigen::Array?
示例:
#include <Eigen/Dense>
class A_interface {
public:
template <typename T>
void div_by(const T& rhs);
const auto col(const int col_id) const;
};
enum A_implementation { test };
template <A_implementation A_t> class A;
template <>
class A<test> : public A_interface{
public:
A(const int n_rows, const int n_cols)
: _n_rows(n_rows), _n_cols(n_cols),
_data(n_rows, n_cols) {}
const auto col(const int col_id) const {
return _data.col(col_id);
}
template <typename T>
void div_by(const T& rhs) {
for (int i = 0; i < _n_cols; ++i) {
_data.col(i) /= rhs.col(i);
}
}
private:
const int _n_rows;
const int _n_cols;
Eigen::ArrayXXf _data;
template <A_implementation A_t> friend class A;
};
int main() {
A<test> a(10,2);
A<test> b(10,2);
a.div_by(b);
}
我想这样做是因为并非 A 的所有实现都使用 Eigen::Array。
在这种情况下,div_by
方法中的双循环是由 Eigen3 或编译器矢量化的吗?
是 div_by
如果两个数组都存储 column-wise(Eigen 中的默认值),将被矢量化。但是你为什么要在列上循环? _data/=rhs
呢?为什么要存储 _n_rows,n_cols
?信息已经在 _data
.