Я хочу использовать собственные типы для обработки изображений.В модуле Tensor по-прежнему отсутствует слишком много функций (плюс он внутри не поддерживается), поэтому я хочу использовать Eigen::Array<Eigen::Array<Type, 3, 1>, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
.
Eigen не векторизует операции с Eigen::Array<Type, 3, 1>
.Например, example2 в приведенном ниже коде приводит к более эффективной сборке (однако, концептуально он такой же, как в example1).
Я предполагаю, что есть некоторые пакетные признаки, которые позволяют Eigen векторизовать различные коэффициенты для общих арифметических типов.Интересно, как трудно будет добавить свойства пакета для массива и как мне это сделать.
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)
}