关于simd:avx2-使用vpshufb指令做字符分类

最近看到simdjson的论文,其中应用vpshufb指令做的字符匹配和分类,感觉这个办法很有播种,想分享以下。 先说simdjson中为啥用这个指令,它须要从字符数组中提取出6种控制字符(‘:’, \’, ‘:’, ‘"’, ‘{’, ‘}’),以及空格换行等4种无实际意义的字符(‘\r’,‘\n’,‘\t’,‘ ’)。 vpshufb是汇编指令,在C++中能够用__m256i _mm256_shuffle_epi8 (__m256i a, __m256i b)。 __m256i _mm256_shuffle_epi8 (__m256i a, __m256i b)算法过程:FOR j := 0 to 15 i := j*8 IF b[i+7] == 1 dst[i+7:i] := 0 ELSE index[3:0] := b[i+3:i] dst[i+7:i] := a[index*8+7:index*8] FI IF b[128+i+7] == 1 dst[128+i+7:128+i] := 0 ELSE index[3:0] := b[128+i+3:128+i] dst[128+i+7:128+i] := a[128+index*8+7:128+index*8] FIENDFORdst[MAX:256] := 0简略解释一下, __m256i能够当做有256个bit位,假如i=8,那么b[i+3:i]就是b[11:8],也就是第8到11bit,这四个bit组成一个无符号整数。四个比特最大是1111,也就是十六进制的f。 _mm256_shuffle_epi8能够当作是一种查表形式,然而只能用每个字节的低四位去查。从b中获取每个字节的低四位。其值只能是0-15中的一种,把这个值当作索引,而后从a中找这个索引对应的值。总之,能够认为_mm256_shuffle_epi8是一种映射关系,将一个数映射到另一个数。 下边是_mm256_shuffle_epi8的两个应用例子。 如果有一个字节数组,存的都是ascii,你须要从中找到小写字母。a-z对应的十六进制示意是:61-6f , 70-7a (这里没写成61-7a是因为后边解决须要) 将61-6f分成一组,是因为它们高四位都是6,70-7a高四位都是7。因为高四位一样的数能够被分到一个组里边。 算法思路是将一个字节的高四位,低四位别离应用_mm256_shuffle_epi8做映射,两个映射后的后果做与运算,最终后果不为0,就代表是须要的字符。 ...

December 26, 2021 · 2 min · jiezi

关于simd:NEON指南6NCNN

https://github.com/Tencent/nc...

April 12, 2021 · 1 min · jiezi

关于simd:NEON指南4Neon-intrinsics-chromium-case-study

学习路线指南:https://zhuanlan.zhihu.com/p/...原文地址:https://developer.arm.com/arc...原文链接可能打不开,能够用这个:https://developer.arm.com/doc... Neon intrinsics chromium case study本指南次要介绍Chromium中的neon利用,方向不太感兴趣,不翻了

April 12, 2021 · 1 min · jiezi

关于simd:NEON指南5Coding-for-Neon

学习路线指南:https://zhuanlan.zhihu.com/p/...原文地址:https://developer.arm.com/arc... Coding for NeonLoad and store - example RGB conversion (HWC->CHW)将RGB数据从memory程序拷入registers的会使通道的swap变得蠢笨。思考以下指令,该指令一次从存储器将一个字节加载RGB数据到三个Neon寄存器的间断通道中LD1 { V0.16B, V1.16B, V2.16B }, [x0] Load and store - data structuresLoad and store - leftoversPermutation - rearranging vectorsPermutation - Neon instructionsMatrix multiplicationShifting left and rightRelated information

April 12, 2021 · 1 min · jiezi

关于simd:NEON指南1Introducing-Neon-for-Armv8A

学习路线指南:https://zhuanlan.zhihu.com/p/...原文地址:https://developer.arm.com/arc... Introducing Neon for Armv8-AData processing methodologies 数据处理形式Single Instruction Single Data (SISD)大多数Arm指令都是单指令单数据(SISD)。每条指令在单个数据源上执行其指定的操作。因而,解决多个数据项须要多个指令。例如,要执行四个加法运算,须要四个指令来对四对寄存器的值进行相加: ADD w0, w0, w5ADD w1, w1, w6ADD w2, w2, w7ADD w3, w3, w8如果您要解决的值小于最大位大小,则SISD指令会节约该额定的潜在带宽。例如,将8位值相加时,须要将每个8位值加载到独自的64位寄存器中。因为处理器,寄存器和数据门路都是为64位计算而设计的,因而对小数据量执行大量独自操作不会无效地利用机器资源。 Single Instruction Multiple Data单指令多数据(SIMD)指令对多个数据项同时执行雷同的操作。这些数据项在较大的寄存器中打包为独自的通道。 例如,以下指令将四对单精度(32位)值相加。然而,在这种状况下,将值打包到两对128位寄存器中的独自通道中。而后将第一个源寄存器中的每个通道增加到第二个源寄存器中的相应通道,而后再存储在指标寄存器中的同一通道中: ADD V10.4S, V8.4S, V9.4S// This operation adds two 128-bit (quadword) registers, V8 and V9,// and stores the result in V10.// Each of the four 32-bit lanes in each register is added separately.// There are no carries between the lanes. ...

April 12, 2021 · 1 min · jiezi