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

news2024/11/5 17:12:58

本文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,!appengine

package main

import (
	"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.coloradmin.cn/o/2233702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp+vite配置环境变量

文章目录 前言一、配置变量二、定义变量生效三、脚本执行使其生效使用 总结如有启发&#xff0c;可点赞收藏哟~ 前言 查看官方文档 由于官方提示不支持在package.json配置脚本 --mode xx&#xff08;实际H5是可以的&#xff0c;但是在微信小程序等使用import.meta.env就会报错…

#Prompt | AI | LLM # 人类如何写出LLM理解的Prompt

一、如何写好Prompt 结构化Prompt 结构化Prompt是对信息进行组织&#xff0c;使其遵循特定模式和规则&#xff0c;以便于有效理解信息。常用模块包括&#xff1a; Role: 指定角色&#xff0c;使模型聚焦于特定领域。Profile: 包括作者、版本、语言和描述。Goals: 描述Prompt的…

Qt项目实战:红绿灯小程序

目录 一.初始化对象 二.捕获并处理特定的事件 三.自定义绘制方法 四.绘制外部边框 五.绘制内部边框 六.绘制按钮的背景色 七.绘制覆盖层&#xff08;高光效果&#xff09; 八.效果 九.代码 1.h 2.cpp 一.初始化对象 1.设置文本、颜色、边框和背景色等默认值。 2.安…

九泰智库 | 医械周刊- Vol.66

⚖️ 法规动态 北京视觉科学与转化医学研究中心正式成立 北京视觉科学与转化医学研究中心&#xff08;BERI&#xff09;于2024年10月26日在清华大学成立&#xff0c;旨在深入贯彻党的二十届三中全会精神&#xff0c;助力健康中国建设&#xff0c;推动全球视觉健康事业发展。该…

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution&#xff0c;normal是“正常”或“标准”的意思&#xff0c;中文翻译是正态&#xff0c;多完美的…

Web服务器(理论)

目录 Web服务器www简介常见Web服务程序介绍&#xff1a;服务器主机主要数据浏览器 网址及HTTP简介URLhttp请求方法:2.3 HTTP协议请求的工作流程&#xff1a; www服务器的类型静态网站动态网站 HTTPS简介概念解释SSL协议分为两层SSL协议提供的服务 HTTPS安全通信机制图解过程 快…

解决方案 | 部署更快,自动化程度高!TOSUN同星线控底盘解决方案

Tosun——线控底盘解决方案 在汽车智能化和电动化进程中&#xff0c;智能线控底盘相关的核心技术和产品成为了新能源汽车及智能驾驶产业的重点发展方向。同星智能作为行业先行者&#xff0c;精研汽车电子行业整体解决方案&#xff0c;提供基于TSMaster的底盘HIL仿真测试解决方…

服务器作业(2)

架设一台NFS服务器&#xff0c;并按照以下要求配置 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件设置&#xff1a; [rootlocalhost ~]# vim /etc/exports 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 共享…

架构师备考-软件工程相关补充

目录 软件开发生命周期 软件工程过程 软件维护分类 遗留系统 软件重用 逆向工程 相关概念 抽象层次 需求工程 需求工程主要活动 需求管理的主要活动 需求获取的主要步骤 需求获取方法 需求变更管理的过程 净室软件工程 定义 理论基础 技术手段 应用 缺点 软…

基于SSM+VUE小型企业财务报销管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

站大爷代理IP工具的导入功能介绍

在数字化时代&#xff0c;代理IP成为了网络爬虫、数据挖掘等网络活动中不可或缺的工具。站大爷代理IP工具深刻理解用户的需求&#xff0c;提供了多种代理IP导入方式&#xff0c;让代理IP的管理变得简单高效。下面就来详细了解一下这些便捷的导入方法&#xff1a; 一、站大爷AP…

CSP-J2023T4 旅游巴士(同余最短路)

题目链接&#xff1a;https://www.luogu.com.cn/problem/P9751 题意&#xff1a;给定 n 个点&#xff0c; m 条单向边&#xff0c;一个时间间隔 k 。有这样一些限制条件&#xff1a; 1&#xff09;1号点是入口&#xff0c; n 号点是出口&#xff1b; 2&#xff09;经过一条边…

React系列教程(2)React哲学

豆约翰习惯将掌握某一技术分为5个层次&#xff1a;初窥门径&#xff0c;小试牛刀&#xff0c;渐入佳境&#xff0c;得心应手&#xff0c;玩转自如 本篇属于React框架中的第1层次即初窥门径 我们认为&#xff0c;React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方…

「Mac畅玩鸿蒙与硬件29」UI互动应用篇6 - 多选问卷小应用

本篇将带你实现一个多选问卷小应用&#xff0c;用户可以勾选选项并点击提交按钮查看选择的结果。通过本教程&#xff0c;你将学习如何使用 Checkbox 组件、动态渲染列表、状态管理及用户交互&#xff0c;构建完整的应用程序。 关键词 UI互动应用Checkbox 组件状态管理动态列表…

【linux 多进程并发】0203 网络资源的多进程处理,子进程完全继承网络套接字,避免“惊群”问题

0203 网络资源的多进程处理 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 一、概…

江协科技STM32学习- P32 MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

程序设计方法与实践-时空权衡

什么是时空权衡&#xff1f; 时空权衡是算法设计中的一个众所周知的问题&#xff0c;也就是对算法的空间和时间效率做出权衡&#xff0c;它大概有分两种形式&#xff1a; 对输入的部分数据或者全部数据作预处理&#xff0c;然后对于获得额外信息储存起来&#xff0c;从而加快…

STM32F1学习——TIM

一、STM32中的定时器 在STM32中分为三种定时器&#xff0c;分别是基本定时器&#xff0c;通用定时器和高级定时器&#xff0c;每种定时器都是向下兼容的。 二、定时器详细介绍 a、基本定时器 基本定时器主要由下面与分频器、计数器 和 自动重装寄存器三个组成的时基单元&#…

W5500-EVB-Pico2评估板介绍

目录 1 概述 2 板载资源 2.1 硬件规格 2.2 硬件规格 2.3 工作条件 3 参考资料 3.1 RP2350 数据手册 3.2 W5500 数据手册 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图 (单位 : mm) 3.4 参考例程 认证 CE FCC AWS 资质 Microsoft Azure 认证…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。