_mm_movemask_ps 的 arm-neon 实现.

废话不多说. 用SIMD指令集优化Vector 运算的时候一定会大量使用 _mm_movemask_ps 来获取比较结果.

但是arm-neon 并没有提供这个指令.

参考: http://stackoverflow.com/questions/11870910/sse-mm-movemask-epi8-equivalent-method-for-arm-neon

我没对这个帖子中的结果进行测试, 但是从实现上看, 不是最好的. 其性能,健壮性都不如DirectXMath中的

下面这个是DirectXMath 库的实现:

uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vResult), vget_high_u8(vResult));
            uint16x4x2_t vTemp1 = vzip_u16((uint16x4_t)vTemp.val[0], (uint16x4_t)vTemp.val[1]);
            return (vget_lane_u32(vTemp1.val[1], 1) == 0xFFFFFFFFU);

这里用到2个zip 来混排4个分量, 并最终将每个分量的高位(most sign)组成一个uint32_t 的值,来检查判断结果.

比如 0xFFFFFFFFU 标识全部通过. 0xFF0000FF 则表示 Vector [x,y,z,w]中的y,z 分量未通过检测.

这本身没有问题, 问题是zip 指令开销有点大.

下面是我的实现. 其中Mask cElementIndex 等是因为写博客零时添加的. 实际实现中, 这两个变量都是constexpr 的.

最终在lumia 950 xl 上测试 性能要比DirectXMath 提升约 23% 的性能. (用一个 位与 , 位或 , PADD 代替了两个 zip ).

constexpr   const uint32_t  cElementIndex[4]{1,2,4,8};

static inline uint32_t vmaskq_u32(uint32x4_t& CR)
{
    static const uint32x4_t Mask = vld1q_u32(cElementIndex);
        // extract element index bitmask from compare result.
    uint32x4_t vTemp = vandq_u32(CR, Mask);
    uint32x2_t vL = vget_low_u32(vTemp);    // get low 2 uint32
    uint32x2_t vH = vget_high_u32(vTemp);  // get high 2 uint32
    vL = vorr_u32(vL, vH);
    vL = vpadd_u32(vL, vL);
    return vget_lane_u32(vL, 0);
}

我的实现中, 添加了一个多余的东西,就是cElementIndex {1,2,4,8} 其实可以用{1,1,1,1}或其它非0值都可以.

但是用{1,2,4,8}的目的是便于对最终结果更容易理解, 更符合 movemask 的规范.

比如 if(vmaskq_u32(IntersectionResult) &(0x6)) // 检查IntersectionResult[x,y,z,w]中的  Y,Z 分量是否通过.

后面在把我另外一个也是坑的东西给贴出来吧. 那就是 _mm_div_ps 的neon 实现(二次牛顿插值...).

时间: 2024-08-02 15:13:56

_mm_movemask_ps 的 arm-neon 实现.的相关文章

ARM NEON Optimization Example

ARM NEON Optimization. An Example Http://hilbert-space.de/?p=22 Since there is so little information about NEON optimizations out there I thought I'd write a little about it. Some weeks ago someone on the beagle-board mailing-list asked how to optimi

[arm neon] data type convert (float <-> int32_t)

The conclusion is: NEON intrinsics support converting a float data type to int32 regarding a Q value. The reverse is also supported. Neon intrinsics already do the clip operation to float value outside of [-1, 1]:!! The issue cost 1 Cycles per 32x2 o

NEON简介

"ARM Advanced SIMD",nick-named "NEON", it provides:(1).A set of interesting scalar/vectorinstructions and registers(the latter are mapped to the same chip area as theFPU ones), comparable to MMX/SSE/3DNow! in the 86 world;(2).VFPv3-D32

NEON简介【转】

转自:http://blog.csdn.net/fengbingchun/article/details/38020265 版权声明:本文为博主原创文章,未经博主允许不得转载. “ARM Advanced SIMD”,nick-named “NEON”, it provides:(1).A set of interesting scalar/vectorinstructions and registers(the latter are mapped to the same chip area a

Secrets of Android.mk[转]

Intro to Android.mk Simple example NDK Usage Defining Modules Simple APK APK Dependent on static .jar file APK signed with the platform key APK that signed with vendor key Prebuilt APK Adding a Static Java Library Android.mk variables Introduction to

NDK配置文件Android.mk简介

简介 android.mk主要描述了c或者c++文件时如何在ndk工程中被使用的,该小节主要描述了android.mk的构建规则 概览 android.mk文件描述了你的源码是如何构建的,主要包括:该文件实际上是一个简化了的GNU makefile文件.该文件被构建系统解析一次或多次,因此你需要尽可能少得自定义变量.同样的,也不能在解析过程中认为未定义任何变量 该文件语法决定了如何把你的源码组织到"模块"中,"模块"的概念是: 静态库 动态库 可执行文件 编译器仅仅

Android.mk官方说明 中文翻译

转载请注明出处:http://blog.csdn.net/qq_15650553/article/details/51548025 译者注:第一次做这样的翻译,自己感觉还是很多不足,有些概念没有很好的理解,所以翻译过来的中文可能也会有问题.这篇文章主要是用来记录自己的学习所得.所以网友们若要根据下面的译文来学习,不是不行,但是请谨慎. 这篇文章描述了Android.mk文件的语法,这个文件将Android NDK与你的c/c++代码联系到一起. Overview 这个Android.mk文件存在

几种图片格式的简介

http://blog.ibireme.com/2015/11/02/mobile_image_benchmark/ 几种图片格式的简介 首先谈一下大家耳熟能详的几种老牌的图片格式吧: JPEG 是目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格式.它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换得存储空间.由于它太过常见,以至于许多移动设备的 CPU 都支持针对它的硬编码与硬解码. PNG 诞生在 1995 年,比 JPEG 晚几年.它本身的设计目的是替代 GIF 格

将 Android* Bullet 物理引擎移植至英特尔® 架构

简介 由于目前的移动设备上能够使用更高的计算性能,移动游戏现在也可以提供震撼的画面和真实物理(realistic physics). 枪战游戏中的手雷爆炸效果和赛车模拟器中的汽车漂移效果等便是由物理引擎所提供,其核心是物理模拟. 一般而言,物理模拟决定了游戏引擎的性能. 一款游戏成功与否通常取决于物理引擎计算物理模型的速度和准确度. 本文将介绍如何构建 Android 版 Bullet 物理引擎并将其移至到基于英特尔? 凌动 SoC 的平台. Bullet 物理 Bullet 物理库是一个实时物

2015GitWebRTC编译实录14

libvpx 尝试用脚本编译了下,发现有问题,就偃旗息鼓,改用他自己的configure了,在网上找了下,Git上有个现成的,直接用,更好些. https://github.com/brion/VPX-iOS 注意他这里有个子模块,需要更新下,其他的还好说. [230/1600 ] CC obj/third_party/libvpx/source/libvpx/vp8/common/libvpx.blockd.o[231/1600 ] CC obj/third_party/libvpx/sour