neon-guide, 使 ARM NEON文档可以访问( 示例)

分享于 

9分钟阅读

GitHub

  繁體 雙語
Makes ARM NEON documentation accessible (with examples)
  • 源代码名称:neon-guide
  • 源代码网址:http://www.github.com/thenifty/neon-guide
  • neon-guide源代码文档
  • neon-guide源代码下载
  • Git URL:
    git://www.github.com/thenifty/neon-guide.git
    Git Clone代码到本地:
    git clone http://www.github.com/thenifty/neon-guide
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/thenifty/neon-guide
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    NEON内部指南

    使 ARM NEON文档可以访问( 用示例)。 来自ARM文档的沮丧,一般缺乏示例。

    介绍

    当你把你的iOS代码转换成NEON时,通常它是内部循环,可以用并行代码编写。 你还必须记住,你的负载/存储操作越多,代码的速度就越慢。

    假设

    本指南是关于内置内置,它可以在 32bit 和 64bit 架构上工作。 向量的长度通常为 4,但通常可以删除字母2,在指令 NAME 中使用 2 -vectors。

    命令行语法

    浮点

    算法
    • 添加:英镑vaddq_f32或者英镑 vaddq_f64
    
    
    
    
    float32x4_t v1 = { 1.0, 2.0, 3.0, 4.0 }, v2 = { 1.0, 1.0, 1.0, 1.0 };
    
    
    float32x4_t sum = vaddq_f32(v1, v2);
    
    
    // => sum = { 2.0, 3.0, 4.0, 5.0 }
    
    
    
    
    • 乘法:英镑或者英镑的vmulq_f64
    
    
    
    
    float32x4_t v1 = { 1.0, 2.0, 3.0, 4.0 }, v2 = { 1.0, 1.0, 1.0, 1.0 };
    
    
    float32x4_t prod = vmulq_f32(v1, v2);
    
    
    // => prod = { 1.0, 2.0, 3.0, 4.0 }
    
    
    
    
    • 累加和累加:vmlaq_f32
    
    
    
    
    float32x4_t v1 = { 1.0, 2.0, 3.0, 4.0 }, v2 = { 2.0, 2.0, 2.0, 2.0 }, v3 = { 3.0, 3.0, 3.0, 3.0 };
    
    
    float32x4_t acc = vmlaq_f32(v3, v1, v2); // acc = v3 + v1 * v2
    
    
    // => acc = { 5.0, 7.0, 9.0, 11.0 }
    
    
    
    
    • 乘以标量:英镑vmulq_n_f32或者 vmulq_n_f64
    
    
    
    
    float32x4_t v = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float32_t s = 3.0;
    
    
    float32x4_t prod = vmulq_n_f32(v, s);
    
    
    // => prod = { 3.0, 6.0, 9.0, 12.0 }
    
    
    
    
    • 乘以一个标量并累加: 英镑vmlaq_n_f32或者英镑
    
    
    
    
    float32x4_t v1 = { 1.0, 2.0, 3.0, 4.0 }, v2 = { 1.0, 1.0, 1.0, 1.0 };
    
    
    float32_t s = 3.0;
    
    
    float32x4_t acc = vmlaq_n_f32(v1, v2, s);
    
    
    // => acc = { 4.0, 5.0, 6.0, 7.0 }
    
    
    
    
    • 反转( 除法所需): 英镑或者英镑 vrecpeq_f64
    
    
    
    
    float32x4_t v = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float32x4_t reciprocal = vrecpeq_f32(v);
    
    
    // => reciprocal = { 0.998046875, 0.499023438, 0.333007813, 0.249511719 }
    
    
    
    
    
    
    
    
    float32x4_t v = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float32x4_t reciprocal = vrecpeq_f32(v);
    
    
    float32x4_t inverse = vmulq_f32(vrecpsq_f32(v, reciprocal), reciprocal);
    
    
    // => inverse = { 0.999996185, 0.499998093, 0.333333015, 0.249999046 }
    
    
    
    
    负载
    • 负载矢量:英镑或者英镑 vld1q_f64
    
    
    
    
    float values[5] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
    
    
    float32x4_t v = vld1q_f32(values);
    
    
    // => v = { 1.0, 2.0, 3.0, 4.0 }
    
    
    
    
    • 为所有通道加载相同的值: 英镑vld1q_dup_f32或者英镑
    
    
    
    
    float val = 3.0;
    
    
    float32x4_t v = vld1q_dup_f32(&val);
    
    
    // => v = { 3.0, 3.0, 3.0, 3.0 }
    
    
    
    
    • 将所有车道设置为硬编码值: 英镑 vmovq_n_f16 或者英镑vmovq_n_f32或者英镑 vmovq_n_f64
    
    
    
    
    float32x4_t v = vmovq_n_f32(1.5);
    
    
    // => v = { 1.5, 1.5, 1.5, 1.5 }
    
    
    
    
    存储
    • 存储向量:英镑vst1q_f32或者英镑的vst1q_f64
    
    
    
    
    float32x4_t v = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float values[5] = new float[5];
    
    
    vst1q_f32(values, v);
    
    
    // => values = { 1.0, 2.0, 3.0, 4.0, #undef }
    
    
    
    
    • 矢量 array的存储通道: 英镑vst4q_lane_f16或者英镑 vst4q_lane_f32 或者英镑 vst4q_lane_f64 ( 更改为英镑 vst1. /vst2.。/英镑 vst3。 其他 array 长度的) ;
    
    
    
    
    float32x4_t v0 = { 1.0, 2.0, 3.0, 4.0 }, v1 = { 5.0, 6.0, 7.0, 8.0 }, v2 = { 9.0, 10.0, 11.0, 12.0 }, v3 = { 13.0, 14.0, 15.0, 16.0 };
    
    
    float32x4x4_t u = { v0, v1, v2, v3 };
    
    
    float buff[4];
    
    
    vst4q_lane_f32(buff, u, 0);
    
    
    // => buff = { 1.0, 5.0, 9.0, 13.0 }
    
    
    
    
    数组
    • 获取值:[n]
    
    
    
    
    float32x4_t v0 = { 1.0, 2.0, 3.0, 4.0 }, v1 = { 5.0, 6.0, 7.0, 8.0 }, v2 = { 9.0, 10.0, 11.0, 12.0 }, v3 = { 13.0, 14.0, 15.0, 16.0 };
    
    
    float32x4x4_t ary = { v0, v1, v2, v3 };
    
    
    float32x4_t v = ary.val[2];
    
    
    // => v = { 9.0, 10.0, 11.0, 12.0 }
    
    
    
    
    最大和最小
    • 两个向量的最大值,元素按元素:
    
    
    
    
    float32x4_t v0 = { 5.0, 2.0, 3.0, 4.0 }, v1 = { 1.0, 6.0, 7.0, 8.0 };
    
    
    float32x4_t v2 = vmaxq_f32(v0, v1);
    
    
    // => v1 = { 5.0, 6.0, 7.0, 8.0 }
    
    
    
    
    • 向量元素最大,使用折叠最大值:
    
    
    
    
    float32x4_t v0 = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float32x2_t maxOfHalfs = vpmax_f32(vget_low_f32(v0), vget_high_f32(v0));
    
    
    float32x2_t maxOfMaxOfHalfs = vpmax_f32(maxOfHalfs, maxOfHalfs);
    
    
    float maxValue = vget_lane_f32(maxOfMaxOfHalfs, 0);
    
    
    // => maxValue = 4.0
    
    
    
    
    • 最小两个矢量,元素按元素:
    
    
    
    
    float32x4_t v0 = { 5.0, 2.0, 3.0, 4.0 }, v1 = { 1.0, 6.0, 7.0, 8.0 };
    
    
    float32x4_t v2 = vminq_f32(v0, v1);
    
    
    // => v1 = { 1.0, 2.0, 3.0, 4.0 }
    
    
    
    
    • 最小矢量元素,使用折叠最小值:
    
    
    
    
    float32x4_t v0 = { 1.0, 2.0, 3.0, 4.0 };
    
    
    float32x2_t minOfHalfs = vpmin_f32(vget_low_f32(v0), vget_high_f32(v0));
    
    
    float32x2_t minOfMinOfHalfs = vpmin_f32(minOfHalfs, minOfHalfs);
    
    
    float minValue = vget_lane_f32(minOfMinOfHalfs, 0);
    
    
    // => minValue = 1.0
    
    
    
    

    条件条件

    • 三元运算符:使用向量比较( 例如 vcltq_f32 为比比较)
    
    
    
    
    float32x4_t v1 = { 1.0, 0.0, 1.0, 0.0 }, v2 = { 0.0, 1.0, 1.0, 0.0 };
    
    
    float32x4_t mask = vcltq_f32(v1, v2); // v1 <v2
    
    
    float32x4_t ones = vmovq_n_f32(1.0), twos = vmovq_n_f32(2.0);
    
    
    float32x4_t v3 = vbslq_f32(mask, ones, twos); // will select first if mask 0, second if mask 1
    
    
    // => v3 = { 2.0, 1.0, 2.0, 2.0 }
    
    
    
    

    链接

    更改 README.md 并发送请求请求。

    作者

    这已经作为开发的一部分提供,这是在的开发过程中进行的。

    自动测量应用程序,自动化的购物,在线购物是一个独特的经验,让他们购买完美的服装。


    DOC  acc  MAKE  ARM  accessible  NEON  
    相关文章