Go使用SIMD指令——以string转为整数为例
本文Go使用SIMD指令采用如下方式:
- C编写对应的程序
- clang编译成汇编
- c2goasm将上述生成的汇编转为go的汇编
准备工具
- clang。直接使用
apt-get install clang
安装即可 - c2goasm。
go get -u github.com/minio/c2goasm
来进行安装 - asm2plan9s。
go get -u github.com/minio/asm2plan9s
- 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执行的汇编
相关文章:
Go使用SIMD指令——以string转为整数为例
本文Go使用SIMD指令采用如下方式: C编写对应的程序clang编译成汇编c2goasm将上述生成的汇编转为go的汇编 准备工具 clang。直接使用apt-get install clang安装即可c2goasm。 go get -u github.com/minio/c2goasm来进行安装asm2plan9s。 go get -u github.com/min…...
分享资源合集
为了方便临时使用到的一些软件,提供百度网盘下载。 通过百度网盘分享的文件:WinHex 21.2 SR-2_x86_x64.exe 链接:https://pan.baidu.com/s/19RAnHl_VcKUcIKADU9z9Gw?pwd6666 提取码:6666 通过百度网盘分享的文件:Zi…...
C#/WinForm 鼠标穿透自定义区域截图(后续实现录屏)
效果 窗体截图录屏 git地址:https://gitee.com/feng-cai/screenshot-recording...
基于SpringBoot的“社区维修平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“社区维修平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录页面 住户管理页面 社区公关管理页面 维…...
图书管理系统汇报
【1A536】图书管理系统汇报 项目介绍1.用户登录注册功能1. 1用户角色管理2.图书管理功能2.1 添加图书2.2 编辑图书2.3 删除图书 3.图书搜索和筛选3.1 图书搜索3.2 图书筛选 4.图书借阅、图书归还4.1 图书借阅4.2 图书归还 5.用户信息管理5.1上传头像5.2修改头像5.3 修改密码 项…...
【发版通知】FormMaking 表单设计器新版发布,赋能企业实现低代码开发!
FormMaking 介绍 FormMaking 是基于 Vue 的可视化表单设计器,赋能企业实现低代码开发模式;帮助开发者从传统枯燥的表单代码中解放出来,更多关注业务,快速提高效率,节省研发成本。目前已经在OA系统、考试系统、报表系统…...
计算机科学与技术-毕业设计选题推荐
基于特定技术的系统设计与实现 基于深度学习的图像识别系统设计与实现基于区块链的数据安全保护技术研究与实现基于云计算的大数据处理平台设计与开发基于物联网的智能家居系统设计与实现基于机器学习的推荐算法研究与实现 面向实际应用的需求分析与开发 智慧医疗信息系统设…...
《C++音频频谱分析:开启声音世界的神秘之门》
在数字音频的广阔领域中,频谱分析是一项强大而引人入胜的技术。它能够将无形的声音转化为可视化的数据,让我们深入了解音频的特征和结构。那么,在 C这个强大的编程语言中,我们又该如何实现对音频的频谱分析呢? 音频频…...
GitHub 上传项目保姆级教程
构建项目仓库 登录 GitHub 并进入主页。点击右上角的 New 按钮,进入创建新仓库页面。输入仓库名称和描述(可选),选择是否公开(Public)或私有(Private)。可以选择是否初始化仓库&…...
联想笔记本电脑睡眠后打开黑屏解决方法
下载联想机器睡眠无法唤醒修复工具 下载地址:https://tools.lenovo.com.cn/exeTools/detail/id/233/rid/6182522.html 使用完后重启电脑,问题解决。...
计算机网络:网络层 —— 路由选择与静态路由配置
文章目录 路由选择路由选择的基本概念路由选择算法路由选择策略 路由器的工作原理路由表静态路由配置默认路由特定主机路由 路由选择 路由选择(Routing)是网络层的一个关键功能,负责在源和目的地之间选择最佳路径,以确保数据包高…...
[LeetCode-55]基于贪心算法的跳跃游戏的求解(C语言版)
/* 题目出处:LeetCode 题目序号:55. 跳跃游戏 题目叙述:给你一个非负整数数组 nums ,你最初位于数组的第一个下标位置 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可…...
C# 将批量图片转为PDF文件
目录 功能实现 范例运行环境 关键代码 组件库引入 将批量图片转换为PDF 总结 功能实现 功能实现主要使用 iTextSharp 库实现,将指定目录下的有序的一组图片,组合生成指定文件名的PDF文件。 范例运行环境 操作系统: Windows Server…...
大模型面试题63题(1-11)
扫一扫,实时跟踪面试题(关注“算法狗”)就可以啦 1. 什么是大型语言模型(LLMs)以及它们的工作原理是什么? 大型语言模型(LLMs)是设计用来理解、处理和生成类似人类文本的高级人工智…...
【Flask】二、Flask 路由机制
目录 什么是路由? Flask中的路由 基本路由 动态路由 路由中的HTTP方法 路由函数返回 在Web开发中,路由是将URL映射到相应的处理函数的过程。Flask是一个轻量级的Web应用框架,提供了简单而强大的路由机制,使得开发者能够轻松…...
Java项目实战II基于Spring Boot的交通管理在线服务系统设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…...
【PythonWeb开发】Flask-RESTful视图类基础知识
flask_restful 是一个扩展库,它为 Flask 提供了快速构建 RESTful API 的功能。使用 flask_restful 可以简化 RESTful API 的开发过程,减少样板代码,并且提供了一些高级特性,如 HTTP 方法的映射、资源路由的定义等。 在flask_restf…...
Kubernetes——part10-2 kubernetes 日志收集方案 EFK
一、EFK 1.1 EFK介绍 EFK为elasticsearch、fluentd、kibana的简称,本案例主要对kubernetes集群日志收集。 1.2 Fluentd介绍 fluentd是一款开源的日志收集工具,其于2016年11月8日被云原生计算基金会录取,并于2019年毕业。 Fluentd优势&…...
mockito+junit完成单元测试
一:单元测试的特点 配合断言使用(可以杜绝System.out)可以重复执行不依赖环境不会对数据产生影响spring的上下文环境不是必须的一般都需要配合mock类框架来实现 二:常用的mock类框架 mockito 官网:Mockito framew…...
基于web的便捷饭店点餐小程序的设计与实现(lw+演示+源码+运行)
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全…...
CUDA环境安装终极指南——Linux(其它系统也一样)
文章目录 前言检查驱动配置nvcc安装cudnn完活 前言 不用看其它文章了,这篇文章保你不踩任何坑,安装方法简单快速 检查驱动 检查驱动是否安装,输入以下命令 nvidia-smi如果驱动已经安装,则可跳过此步,否则ÿ…...
安卓开发之登录页面(跳转版)
目录 前言:基础夯实:效果展示:核心代码:网盘源码: 前言: 熟悉安卓开发的基础知识,了解,弹窗,两个页面进行跳转,页面的布局,按钮,文本…...
solidworks学习6吊环-20241030
solidworks学习6吊环 图 1 使用到的命名:拉伸曲面,旋转曲面,镜像实体,剪裁曲面, 前视基准面绘制 图 2 绘制旋转轴 图 3 旋转曲面 图 4 上视基准面绘制,标准圆边尺寸的时候需要按住shift键标注&#x…...
数据结构和算法-动态规划(3)-经典问题
动态规划常见问题 打家劫舍 题目 [力扣198] 198. 打家劫舍 - 力扣(LeetCode) 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&…...
Java算法-一维前缀和与差分
一、一维前缀和 ① 什么是一维前缀和? 📚 其实通过名字就能知道" 一维前缀和 "的意思: 通过一个一维数组"arr1"而创建的另一个一维数组"arr2","arr2"的每一个元素都是"arr1"…...
Elasticsearch 安装教程:驾驭数据海洋的星际导航仪
目录 一、准备工作1. ES的下载 二、安装步骤三、注意事项四、启动报错1. org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at l…...
【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信
前言 故事背景 简单说下背景,项目中需要用 ProtoBuf 协议转换请求参数,并通过 WebSocket 进行双向通信。重点!一个是 web端(Vue3 TS),一个是微信小程序端(原生 JS)。 剧情发展 …...
独立游戏开发者面临的挑战与困境
在当今竞争激烈的游戏市场中,独立游戏开发者面临着诸多挑战与困境。从游戏版号申请到游戏被抄袭,再到产品同质化以及流量获取难题,乃至外包内卷现象,每一个环节都考验着开发者的智慧与毅力。以下是对这些挑战与闲境的详细分析。 …...
KVM 虚拟机Anolis OS 8.9 下利用宝塔面板中的 Docker 配置 Nextcloud + onlyoffice
第一部分:安装配置 nextcloud 准备 (1)启动一个 Anolis OS 8.9 虚拟机,见下图。该虚拟机为 anlisos8…0.2 虚拟机的 ssh、hostname 、IP地址都已配置好。 (2)宝塔面板也已安装好docker 一、环境 do…...
串口扫盲TTL,TX/TR/GND
1. 串口扫盲TTL,TX/TR/GND 1. 串口扫盲TTL,TX/TR/GND 1.1. TTL1.2. USB转TTL1.3. 串口通信1.4. 引脚缩写1.5. 参考资料 1.1. TTL TX(TXD) 来源于 Transmit 一词,意思为发送,发射RX(RXD) 来源于 Receive 一词 意思为接收,收到GND 地线&…...
企业网站域名后缀/百度百家自媒体平台注册
注:此方法适用于初学配置 虚拟机的同学。其中包含 网络信息安全方向,云计算运维方向的 虚拟机配置,我尽量写的通俗易懂一点。(WIN10操作系统) 问题的出现: 最近在研究学习云计算,搭建OpenStack云…...
怎么把自己做的网站发布/军事网站大全军事网
首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word. 一、PHP环境的搭建 1)一般使用源码包编译安装,而不是binary包安装。因为使用PHP的二进制分发包安装有些冒险,这些版本倾向于忽略…...
国内建筑网站/靠谱的拉新平台
C中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现 来源 http://blog.csdn.net/Virtual_Func/article/details/49756913 参考了网上各种资料,理清楚了 0 与 NULL 以及 nullptr 的关系。 1. 从本质上 1) 0是int型的字面值常量 2) NULL 是预处理变量&a…...
网站备案是干嘛的/网站优化推广教程
ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如 谷歌主导的Android手机系统显示卡顿。证券交易市场,实时性要求非常高,目前主要是C主…...
沈阳祥云男科/嘉兴关键词优化报价
概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。 原型模式要求对…...
租车公司网站 模板/2022年热点营销案例
使用汽车诊断仪进行刷隐藏对汽修师傅来说应该不陌生了,由于高配、低配的差异,许多低配汽车被隐藏了高配功能,把这些隐藏功能释放出来可以给车主带来便利。但是刷隐藏常常会涉及编程、设码知识,有时还要输入通道号等各种数据&#…...