当前位置: 首页 > news >正文

Go使用SIMD指令——以string转为整数为例

本文Go使用SIMD指令采用如下方式:

  1. C编写对应的程序
  2. clang编译成汇编
  3. c2goasm将上述生成的汇编转为go的汇编

准备工具

  1. clang。直接使用apt-get install clang安装即可
  2. c2goasm。 go get -u github.com/minio/c2goasm来进行安装
  3. asm2plan9s。 go get -u github.com/minio/asm2plan9s
  4. yasm。直接使用功能apt-get install yasm,asm2plan9s依赖的工具

示例

// simd.c
#include <immintrin.h>
#include <stdint.h>void simd_str_to_int(const char *str, size_t len,  uint64_t* result) {__m128i ten = _mm_set1_epi8('0');__m128i mult=_mm_set_epi8(1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10);__m128i data = _mm_loadu_si128((__m128i const *)(str));data=_mm_sub_epi8(data, ten);data=_mm_maddubs_epi16(data, mult);mult=_mm_set_epi16(1,100,1,100,1,100,1,100);data=_mm_madd_epi16(data,mult);int32_t da[4];_mm_storeu_si128((__m128i *)da, data);*result= da[0]*1000000000000l+da[1]*100000000l+da[2]*10000+da[3];
}

采用如下命令

clang -S -DENABLE_AVX2 -target x86_64-unknown-none -masm=intel -mno-red-zone -mstackrealign -mllvm -inline-threshold=1000 -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -O3 -fno-builtin -ffast-math -mavx simd.c -o simd.s 

准备文件simd_amd64.go

//go:build !noasm && !appengine
// +build !noasm,!appenginepackage mainimport ("reflect""unsafe"
)//go:noescape
func _simd_str_to_int(src unsafe.Pointer, size int64, result unsafe.Pointer)func SIMDToInt(va string) uint64 {h := (*reflect.StringHeader)(unsafe.Pointer(&va))var result uint64_simd_str_to_int(unsafe.Pointer(h.Data), int64(len(va)), unsafe.Pointer(&result))return result
}

clang导出的函数符号是以下划线开头,即_simd_str_to_int

开始导出go汇编

c2goasm -a simd.s simd_amd64.s

注意输出文件的名必须和对应声明go文件的名一致。即都为simd_amd64

参考文献

通过c生成的汇编,生成可供go执行的汇编
如何更快地将string转换成int/long


http://www.mrgr.cn/news/63207.html

相关文章:

  • 什么?一级造价师考试是“纸老虎”?
  • 数字系统的RTL设计{2}
  • 因特网的概述和三种交换方式
  • python实现钉钉群机器人消息通知(消息卡片)
  • HTML、JavaScript和CSS实现注册页面设计
  • 【力扣 + 牛客 | SQL题 | 每日6题】牛客SQL热题 + 力扣hard
  • netty之bootstrap源码分析
  • Android 中选择本地文件并获取文件路径
  • BC1 2充电协议简介
  • JS进阶级案例-----时钟
  • Python零基础 [2.3] if else 语句的详解与示例
  • 《PHP爬虫:当“购物狂”遇上“代码诗人”》
  • 算子级血缘助企业数据管理“自动化、精细化、智能化”
  • Redis 中的定期删除和惰性删除究竟是怎样实现的?
  • flutter报错‘/Users/xxx/.gradle/caches/journal-1/file-access.bin‘.
  • 用图像增强来充实训练数据集,算不算是一种‘摸鱼’的方法?
  • 大型语言模型如何影响就业?大模型入门到精通,收藏这篇就够了
  • 初学者如何对大模型进行微调?
  • Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
  • 页面跳转不刷新 histoy.go hisroty.back不生效
  • Consul 实战指南
  • 【JVM详解JVM优化】JVM内存模型
  • BO-Transformer-LSTM多特征分类预测/故障诊断(Matlab实现)
  • 你知道前端水印功能是怎么实现的吗?
  • 外贸商城平台系统开发:多语言设计与实现
  • 【unique_str 源码学习】