通过从所有元素中减去最小元素来防止溢出的内在函数[无循环]

时间:2016-12-26 12:54:32

标签: c arm embedded intrinsics neon

我想弄清楚在C语言中使用Neon Intrinsic进行ARM时防止溢出的一种棘手方法。这是按元素逐行执行的逻辑:

min = array[0]
for(i=1;i<64;i++)
{
    if(min > array[i])
    {
        min = array[i];
    }
}
for(i=0;i<64;i++)
{
    array[i] -= min;
}

我想要一种替代解决方案,通过以SIMD方式执行操作,无需逐个元素操作。感谢。

注意:在我的情况下,我使用四个uint8x16_t数据类型的向量。我想从它们中找到一个最小值并执行归一化(即;我的数组包含64个元素,分割成四个uint8x16_t向量)。

1 个答案:

答案 0 :(得分:0)

  1. 多次使用vmin_u8在向量中累积最小值(例如8x8)
  2. 在同一矢量上使用vpmin_u8'n'次-冒泡排序(此处n = 8)
  3. 使用vdup_8(sorted_result [0])构建具有目标长度的向量
  4. 使用vsub_u8减去=>归一化。

    –欺骗