使用并行提取解码 UTF8

主要观点:近期写了一个利用pext指令的无分支 utf8 解码器,符合[rfc-3629],整个解码器约 29 条指令,代码可在[utf8-pext.c]找到。介绍了 utf8 编码规则,解码器接口,加载字节的两种方式(完全无分支和实用接口),确定序列长度的方法及注意事项,提取码点的过程(利用pext指令),验证部分(包括码点范围、超长编码、代理对等),还给出了基准测试结果(不同处理器上各解码器的速度对比),最后得出此方法因硬件问题不具实用性的结论。
关键信息

  • 无分支解码器利用pext指令提取 utf8 码点,兼容[rfc-3629]。
  • 介绍 utf8 编码的不同长度格式及重要位。
  • 解码器接口及err字段的处理方式。
  • 加载字节的两种方式及优缺点。
  • 利用pext提取码点及相关掩码计算。
  • 各种验证条件及处理方法。
  • 不同解码器在不同处理器上的速度测试结果。
    重要细节
  • gcc -O3 -march=x86-64-v3编译下整个解码器约 29 条指令。
  • 无分支加载字节时需保证缓冲区有 4 字节空字符填充。
  • 确定长度时利用长度表,注意有效和无效情况。
  • 验证部分的各种条件及掩码设置。
  • 不同解码器在 intel 14900KS 和 3700x 上的速度差异及原因(pext在旧 ryzen 上由微码模拟,性能差)。
阅读 12
0 条评论