玩一玩 golang 汇编(二)
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
上次玩 golang 汇编是使用了一个 python 的 intel 汇编转换 plan9 汇编的工具,很不好用。
本次试试一些 golang 实现的工具。
因为主要是想用汇编优化 linux amd64 平台下的代码,所以主要围绕这个平台展开。
0. Macos M2 下安装linux/amd64 开发容器
因为我用的开发机器是 macbook m2,为了便于模拟 linux/amd64 环境,使用 docker 安装开发容器先:
# 拉取镜像
docker pull golang:1.21.3 --platform=linux/amd64
# 启动容器
docker run -d -it --name amd64_go -v ~/code:/Users/ahfuzhang/code/ --cpus=4 -m=1g golang:1.21.3 bash
# 进入容器
docker container exec -it amd64_go bash
1.安装各种工具
go get -u github.com/minio/asm2plan9s
go get -u github.com/minio/c2goasm
go get -u github.com/klauspost/asmfmt/cmd/asmfmt
apt-get install build-essential
apt-get install clang
2.写一个 c 函数
本例子中使用凯撒加密的字符查表的实现:
pkg/caesar/c/caesar.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <immintrin.h>
#include <avx2intrin.h>
#include <inttypes.h>
#include <assert.h>
typedef uint8_t Table[26][256];
void caesarEncode(uint8_t* out, uint8_t* in, int len, int rot, Table* table){
rot = rot % 26;
uint8_t* end = in + len;
uint8_t* line = (uint8_t*)((*table)[rot]);
for (;in<end; in++, out++){
*out = (uint8_t)line[*in];
}
}
以上代码编译为intel汇编:
clang -mno-red-zone -fno-asynchronous-unwind-tables -fno-exceptions \
-fno-rtti -fno-stack-protector -nostdlib -O3 \
-masm=intel -mstackrealign -mllvm -inline-threshold=1000 \
-fno-jump-tables \
-msse4 -mavx -mavx2 -mavx512f -mavx512vl -mavx512bw \
-DUSE_AVX=1 -DUSE_AVX2=1 -DNO_TEST \
-S pkg/caesar/c/caesar.c -o pkg/caesar/c/caesar.s
3.使用 c2goasm 来转换为 plan9 汇编
3.1 先准备导出用的 go 文件
pkg/caesar/caesar_amd64.go:
package caesar
import (
"unsafe"
)
//go:nosplit
//go:noescape
func _caesarEncode(out unsafe.Pointer, in unsafe.Pointer, len uint64, rot uint64, table unsafe.Pointer)
// !!! 注意:相比 c 中的函数名,这里多了一个下划线
func CaesarEncode(in []byte, out []byte, rot int) {
_caesarEncode(unsafe.Pointer(&out[0]), unsafe.Pointer(&in[0]), uint64(len(in)), uint64(rot), unsafe.Pointer(&tableOfCaesar[0][0]))
}
3.2 执行命令行
c2goasm -a pkg/caesar/c/caesar.s pkg/caesar/caesar_amd64.s
最终生成了这样一个汇编文件:
//+build !noasm !appengine
// AUTO-GENERATED BY C2GOASM -- DO NOT EDIT
TEXT ·_caesarEncode(SB), $0-40
MOVQ out+0(FP), DI
MOVQ in+8(FP), SI
MOVQ len+16(FP), DX
MOVQ rot+24(FP), CX
MOVQ table+32(FP), R8
WORD $0xd285 // test edx, edx
JLE LBB0_3
WORD $0x634c; BYTE $0xc9 // movsxd r9, ecx
LONG $0x4fc16949; WORD $0xc4ec; BYTE $0x4e // imul rax, r9, 1321528399
WORD $0x8948; BYTE $0xc1 // mov rcx, rax
LONG $0x3fe9c148 // shr rcx, 63
LONG $0x23f8c148 // sar rax, 35
WORD $0xc801 // add eax, ecx
WORD $0x0c8d; BYTE $0x80 // lea ecx, [rax + 4*rax]
WORD $0x0c8d; BYTE $0x89 // lea ecx, [rcx + 4*rcx]
WORD $0xc101 // add ecx, eax
WORD $0x2941; BYTE $0xc9 // sub r9d, ecx
WORD $0x6348; BYTE $0xc2 // movsxd rax, edx
WORD $0x0148; BYTE $0xf0 // add rax, rsi
WORD $0x6349; BYTE $0xc9 // movsxd rcx, r9d
LONG $0x08e1c148 // shl rcx, 8
WORD $0x0149; BYTE $0xc8 // add r8, rcx
LBB0_2:
WORD $0xb60f; BYTE $0x0e // movzx ecx, byte [rsi]
LONG $0x0cb60f42; BYTE $0x01 // movzx ecx, byte [rcx + r8]
WORD $0x0f88 // mov byte [rdi], cl
LONG $0x01c68348 // add rsi, 1
LONG $0x01c78348 // add rdi, 1
WORD $0x3948; BYTE $0xc6 // cmp rsi, rax
JB LBB0_2
LBB0_3:
RET
执行单元测试,一切正常!
Have func.
补充:当 c 代码中使用 avx512 的函数的时候,c2goasm 无法翻译这些代码,在这些代码前面加上了 //注释。就算手动删除这些注释,go build 过程中也无法编译这些指令。
具体原因还要再查。
玩一玩 golang 汇编(二)的更多相关文章
- 玩转Vim-札记(二)
玩转Vim-札记(二) 距上篇博文已有一周有余,上次主要介绍了编辑器之神Vim的起源.安装并介绍了两种模式以及一些简单的操作.本次将继续对Vim的使用进行介绍. 登堂入室 首先接着说移动吧: 0 → ...
- 玩转Node.js(二)
玩转Node.js(二) 先来回顾上次的内容,上一次我们使用介绍了Node.js并写了第一个服务器端的Hello World程序,在这个Hello World程序中,请求自带的http模块并将其赋给h ...
- 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ...
- 为什么说程序员都应该玩一玩GitHub
既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...
- [golang]golang 汇编
https://lrita.github.io/2017/12/12/golang-asm/#why 在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于 ...
- Golang 汇编asm语言基础学习
Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...
- 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo
Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...
- .Net程序员玩转Android系列之二~Android Framework概要(1)
从windows操作系统说起 人们总是喜欢从将陌生的事物和自己所了解的东西关联起来,以加深对未知事物的了解,这一讲我们从windows操作系统说起,逐步引领带大家走入android的世界.写任何程序都 ...
- 玩App怎么赚钱(二)
紧接上篇文章,谈到App前赚钱的一些门道,其实还有很多了,需要你自己去挖掘App到底有什么价值.有价值的东西就能形成交易,而交易的过程中是用金钱作为流通手段,所以说赚钱没那么高大上,它的本质就是价值的 ...
- 强化学习实战 | 表格型Q-Learning玩井字棋(二)
在 强化学习实战 | 表格型Q-Learning玩井字棋(一)中,我们构建了以Game() 和 Agent() 类为基础的框架,本篇我们要让agent不断对弈,维护Q表格,提升棋力.那么我们先来盘算一 ...
随机推荐
- “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
摘要:华为云DRS成功助力T3出行在规定时间内完成数十TB级全量数据的迁移. 数字化潮流浩浩汤汤,企业上云如火如荼,网约车行业也借助这一股东风展现出了蓬勃的生命力,因为它的高效便捷,吸引了越来越多的都 ...
- IAST 初探:博采众长、精准定位、DevOps友好
之前的文章中,我们了解了 SAST 和 DAST,本文将介绍将两者优势相结合的安全测试技术--IAST. ✦ ✦ 交互式应用安全测试(IAST)是一个自动识别和诊断应用程序和 API 漏洞的技术,它结 ...
- 新变化新营销 这些知识点你得 Get!(文末有 PPT 福利首次放送)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在刚刚结束的第 7 期火山引擎数智平台 VeDI「增长课堂」上,火山引擎数智平台 VeDI 零售行业解决方案. ...
- Solon 1.6.29 发布,轻量级应用开发框架
关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web.Data.Jo ...
- Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' in your configuration.
Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' ...
- Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 【短道速滑六】古老的视频去噪算法(FLT_GradualNoise)解析并优化,可实现1920*1080 YUV数据400fps的处理能力。
这个好像没有啥对应的论文可以找到,在百度上搜索也能找到一些相关的资料,不过就直接是代码,可以看到其实来自于一个叫做DScaler的项目,在github上目前还能找到该项目的完整资料. 详见:https ...
- Codeforces Round #623 (Div. 2) A~D题,D题multiset使用
比赛链接:Here 1315A. Dead Pixel 签到题, 比较四个值 max(max(x, a - 1 - x) * b, a * max(y, b - 1 - y)) 1315B. Home ...
- 智能制造之 SMT 产线监控管理可视化
前言 随着<中国制造2025>的提出,制造业迎来了全新的发展机遇.更多的企业将制造业信息化技术进行广泛的应用,如 MES 系统.数字孪生以及生产管理可视化等技术的研究应用,已经成为社会各界 ...
- 7 Englishi 词根
1.跟直播,跟复习课,完成作业 2. 基础差加餐,听录播 3.如何听课 4.单词学习反复多次 如何记笔记 语块的汉语意思 单词的记忆方式和固定表达 俩种方式记忆单词 语块关联记忆 基础词根词缀(6节课 ...
