C++中使用SIMD的方法

写在前面

        最近在看《游戏引擎架构》这本书,第四章介绍了利用simd来加速向量运算,感到十分有趣,在此记录下simd的使用方法。

1.SIMD是什么

        SIMD全称为Single Instruction Multiple Data,即单指令多数据流。x86指令集中提供了一些SIMD指令,使用SIMD指令可以将多个操作数打包到一个专用的寄存器中进行运算。这样一来可以方便地进行小到向量内积,大到矩阵运算音视频解码等操作,同时获得一定的性能提升。
        另外值得一提的是x86指令集中的SIMD指令集自发布以来并不是一成不变的,从最早的MMX(1996年)到SSE,再到后来的AVX、AVX2等,在使用时要加以区分尽量避免混用。

2.示例代码

2.1 主要数据结构

        前文中也提到了,simd指令是对多个打包的操作数进行运算,所以C++中提供了相应的数据结构来存储这些打包的数据,用浮点数来举例说,一个单精度浮点数占4个字节也就是32位,我们要同时运算四个浮点数的话就需要将其封装为长为16字节(128位)的数据包。这样的数据结构在程序中以__m128的形式来表示。除此之外还有很多封装例如

__m64				// 64位紧缩整数(MMX)
__m128d				// 128位紧缩双精度(SSE2)
__m128i				// 128位紧缩整数(SSE2)
__m256				// 256位紧缩单精度(AVX) 
__m256
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值