用户定义类型的特征包处理

时间:2018-05-07 18:29:13

标签: c++ templates eigen eigen3

我想使用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)
}

0 个答案:

没有答案