c - 无法使用 NEON Intrinsics 加载浮点值

标签 c floating-point arm neon intrinsics


无论如何,我都无法将浮点值加载到 NEON 128 位寄存器中! 我尝试了一切可能的方法来加载 float ,但寄存器仍然为零(通过调试发现)。

/* neon_example.c - Neon intrinsics example program */
    #include <stdint.h>
    #include <stdio.h>
    #include <arm_neon.h>

    /* fill array with increasing integers beginning with 0 */
    void fill_array(float32_t *array, int size)
    {    int i;
        for (i = 0; i < size; i++)
        {
             array[i] = 2.0f;
             printf("%f",array[i]);
        }
    }

    /* return the sum of all elements in an array. This works by calculating 4 totals (one for each lane) and adding those at the end to get the final total */
    float sum_array(float32_t *array, int size)
    {    
         float32_t a,b,c,d,add;
         float32x4_t acc= vdupq_n_f32(0.0);
         for (; size != 0; size -= 4)
         {
           float32x4_t vec =vdupq_n_f32(0.0f);;
           vec=vld1q_f32(array);
    //The above operation does not load values??????????????????????
           array += 4;
           acc = vaddq_f32(acc,vec);
          }

         vst1q_lane_f32(&a,acc,0);
         vst1q_lane_f32(&a,acc,1);
         vst1q_lane_f32(&a,acc,2);
         vst1q_lane_f32(&a,acc,3);
         add=a+b+c+d;

          //return (int)vget_lane_s64(acc2, 0);
         return add;

    }
    /* main function */
    int main()
    {
          float32_t my_array[100];
          fill_array(my_array, 100);
          printf("Sum was %f\n", sum_array(my_array, 100));
          return 0;
    }

最佳答案

我刚刚运行了你的代码,它正确加载到寄存器中。我在 Xcode 4.6 中使用 LLVM 4.2 构建了代码。

实现 Guy Sirton 的更改修复了该错误并产生了更具可读性的函数:

float32_t sum_array(float32_t *array, int size)
{
    float32_t arr[4],add;
    float32x4_t acc= vdupq_n_f32(0.0);
    for (; size != 0; size -= 4)
    {
        float32x4_t vec=vld1q_f32(array);
        array += 4;
        acc = vaddq_f32(acc,vec);
    }

    vst1q_f32(arr, acc);

    add = arr[0] + arr[1] + arr[2] + arr[3];

    return add; 
}

关于c - 无法使用 NEON Intrinsics 加载浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14597334/

相关文章:

c - 为什么我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的参数

javascript - 为什么 JavaScript 中 << 0 会删除数字的小数部分?

python - 为arm-none-linux-gnueabi-g++编译python以获得LIB的替代方法

c - Atmel SAM v71 XPlained - 无法与端口 C 配合使用

c - 海合会表现

c++ - 使用 minizip 从内存缓冲区打开文件

c - 我编写了一个 C 函数来确定一个数字是否为素数,但它不起作用

c - C float 中的精度

python - Numpy arange float 不一致

c - ARM:链接寄存器和帧指针