c - Neon 内在功能是通过从所有元素中减去最小元素来防止溢出[无循环]

标签 c arm embedded intrinsics neon

我想找出一种巧妙的方法来防止在 C for ARM 中使用 Neon Intrinsic 时发生溢出。以下是逐个元素执行的逻辑:

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 数据类型 vector 。我想从中找到一个最小值并执行标准化(即,我的数组有 64 个元素,分为四个 uint8x16_t vector )。

最佳答案

  1. 多次使用 vmin_u8 来累积 vector 中的最小值(例如 8x8)

  2. 对同一 vector 使用 vpmin_u8 'n' 次 - 冒泡排序(此处,n = 8)

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

  4. 使用 vsub_u8 进行减法 => 标准化。

    --ffox

关于c - Neon 内在功能是通过从所有元素中减去最小元素来防止溢出[无循环],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41331630/

相关文章:

c++ - 在 GNU 的 C++ 代码中使用 C 头文件。包含内联程序集 : impossible constraint in 'asm' 的错误

android - ARM NEON 汇编器——使用和理解

android - 为 Android 上的 MediaStreamer2 控制台应用程序提供 JVM

c - Makefile 依赖项

调试 ARM Cortex-M4 中的硬故障

embedded - "embedded hardware system"的最佳描述是什么?

c - 使用 STM32 Nucleo 将数据打印到文件中

embedded - lua 上的图形库

c - 在 C 中使用数组(用另一个输入打印一个输入)

c - Batcher的奇偶归并排序并行策略