【问题标题】:Neon: maximum of four floating values inside float32x4_t vector霓虹灯:float32x4_t 向量内最多四个浮点值
【发布时间】:2015-06-03 09:57:48
【问题描述】:

我想找出一个 32x4 向量中四个值中的最大值。

我有一个float32x4_t 类型的向量:

float32x4_t maxR = {10.21,10.25,23.5,24.86} //FOR EXAMPLE

我想在这四个中找出最大值(10.21,10.25,23.5,24.86),有什么指示吗?

我正在考虑使用vpmax_f32 内在函数,但得出的结论是这是错误的,因为返回类型是float32x2_t,它又是一个向量类型。那么,谁能告诉我这个操作的方法?

【问题讨论】:

  • 什么是 float32x4_t?一个数组?
  • 不,它只是一个浮点向量。它是我的代码的一部分..我对所有循环进行计算并最终得到 float32x4_t maxR 。并且想要找到这四个中的最大值,因为只想返回 maxR 类型的变量。我试过 maxR = max(maxR_vect.f0,max(maxR_vect.f1,max(maxR_vect.f2,maxR_vect.f3)));
  • 对不起,我没有得到这个。它是一个向量类型的 float32x4_t 变量。所以这个 std::max_element 对这个没有用
  • 我怎样才能访问 maxR 向量的第一个元素??我试过 maxR.v[0] 这给了我这个错误 -> 错误:请求成员 'v' in 'maxR',这是非类类型'float32x4_t
  • @user3476225:如果您发现自己在使用 SIMD 时需要执行水平操作,这通常表明您的矢量化方法存在缺陷 - 有什么方法可以转置数据以便执行这个最大垂直?也许您可以将一些代码添加到问题中,以便我们可以看到它如何与您正在执行的其他 SIMD 操作相匹配?

标签: arm simd neon cortex-a8


【解决方案1】:

从向量中提取单个值的内在函数是 vget_lane_<type> - 两个适当的成对最大运算将为您留下一个双字向量,其中包含两个通道中的所需值,您可以从中挑选出来:

float horz_max(float32x4_t f) {
    float32x2_t tmp;

    tmp = vpmax_f32(vget_low_f32(f), vget_high_f32(f));
    tmp = vpmax_f32(tmp, tmp);
    return vget_lane_f32(tmp, 0);
}

或者,如果您现在实际上并不需要寄存器中的值,并且无论如何都要把它写回内存变量,那么改用它可能更有效vst1_lane_f32 带有适当的指针来直接存储它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多