【发布时间】: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