【问题标题】:Neon intrinsic to prevent overflow by subtracting the minimum element from all elements [no looping]Neon 通过从所有元素中减去最小元素来防止溢出[无循环]
【发布时间】:2016-12-26 12:54:32
【问题描述】:

我想找出一种巧妙的方法来防止在 C 中使用 Neon Intrinsic for 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 向量)。

【问题讨论】:

  • 先排序,再选择array[0]。您也应该选择一个不同的变量名。 array 是 C++11 中的一个类型。
  • 一对vmin.u8,一些vpmin.u8,一个vdup.8,然后是vsub.u8。似乎不是特别复杂。
  • @EOF 你能提供确切的步骤吗?我不明白。
  • 排序需要O(n log n),而他未排序的搜索只是O(n)。这个问题有vmin的答案; ARM Neon min and max of arrary 只需删除 vmax 行。希望从每个元素中减去不需要成为问题。如果找到零,则存在短路情况。
  • @EOF 成功了。谢谢。 1. 多次使用 vmin_u8 来累积向量中的最小值(比如 8x8) 2. 在同一个向量上使用 vpmin_u8 'n' 次 - 冒泡排序(这里,n = 8) 3. 使用 vdup_8(sorted_result[0]) 来构造目标长度为 4 的向量。使用 vsub_u8 进行减法 => 归一化。

标签: c arm embedded intrinsics neon


【解决方案1】:
  1. 多次使用 vmin_u8 来累积向量中的最小值(比如 8x8)

  2. 在同一个向量上使用 vpmin_u8 'n' 次 - 冒泡排序(这里,n = 8)

  3. 使用vdup_8(sorted_result[0])构造目标长度的向量

  4. 使用 vsub_u8 进行减法 => 归一化。

    --狐狸

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2013-06-18
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多