我想使用Eigen类型进行图像处理。
Tensor模块仍然缺少太多功能(加上它不受支持),所以我想使用Eigen::Array<Eigen::Array<Type, 3, 1>, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
。
Eigen不会使用Eigen::Array<Type, 3, 1>
对操作进行矢量化。例如。下面的代码中的example2导致更高效的汇编(但是,概念上它与example1相同)。
我猜有一些packet_traits允许Eigen在不同的系数上进行矢量化以用于常见的算术类型。我想知道为Array添加数据包特性会有多难,我该怎么办呢。
void example1(const Eigen::Array<Eigen::Array3i, 4, 1>&u,
Eigen::Array<Eigen::Array3i, 4, 1>&v) {
EIGEN_ASM_COMMENT("example1 start");
v = u + Eigen::Array3i(1, 1, 1);
EIGEN_ASM_COMMENT("example1 end");
// Results in a lot of movl and addl
}
void example2(const Eigen::Array<int, 12, 1>&u,
Eigen::Array<int, 12, 1>&v) {
EIGEN_ASM_COMMENT("example2 start");
v = u + 1;
EIGEN_ASM_COMMENT("example2 end");
// Results in:
// vpbroadcastd LCPI1_0(%rip), %xmm0
// vpaddd (%rdi), %xmm0, %xmm1
// vmovdqa %xmm1, (%rsi)
// vpaddd 16(%rdi), %xmm0, %xmm1
// vmovdqa %xmm1, 16(%rsi)
// vpaddd 32(%rdi), %xmm0, %xmm0
// vmovdqa %xmm0, 32(%rsi)
}