SlideShare a Scribd company logo
在 Golang
召喚 SIMD 加速魔法
如何在 ARM64 上開發 SIMD 程式
Yang Hau
golang engineer in Zeals
sse2neon contributor
numpy contributor
什麼是SIMD
一個指令同時平行處理多個運算
在 golang 中透過組合語言實作 SIMD
看一下 C 的例子
在 golang 中透過組合語言實作 SIMD
Go 沒有辦法直接使用 SIMD
可以用 cgo 解決?
- extra gcc dependency
- more time would be taken on compiling
- runtime context switching overhead on cgo
在 golang 中透過組合語言實作 SIMD
看一下 Go 官方怎麼解決
以 golang/crypto 為例子
在 golang 中透過組合語言實作 SIMD
在 golang 中透過組合語言實作 SIMD
- semi-abstract instruction
- 不是全部的指令都有
暫存器
pseudo-registers
虛擬暫存器 FP: Frame Pointer
SP: Stack Pointer
PC: Program Counter
SB: Static Base pointer
arguments
parent
return
address
local
variables
return
address
arguments
parent
return
address
local
variables
return
address
FP
SP
high address
low address
通用暫存器
浮點暫存器
向量暫存器
(R0 - R31)
(F0 - F31)
(V0 - V31)
常數運算
關於常數
Constants are always evaluated as 64-bit unsigned integers.
運算順序
3&1<<2 = (3&1)<<2 = 4
參數順序
x86: add eax, 10
arm: add x3, x2, #0xa
go: ADD $0xa, R2, R3
宣告函式
在 golang 中透過組合語言實作 SIMD
frame size
argument size
middle point
對 slice 進行操作
在 golang 中透過組合語言實作 SIMD
在 golang 中透過組合語言實作 SIMD
宣告全域常數表
只有在當下 source file 可
見
該常數表大小
在 golang 中透過組合語言實作 SIMD
在 golang 中透過組合語言實作 SIMD
向量暫存器
在 golang 中透過組合語言實作 SIMD
預處理器
#include, #define, #ifdef/endif
#if, ##
實際範例
以開發 sha512 作為例子
已知在 armv8.2 之後有新的 sha512
SIMD 指令
● SHA512H
● SHA512H2
● SHA512SU0
● SHA512SU1
看一下程式碼吧
應用 disassembler
在 golang 中透過組合語言實作 SIMD
相關範例
https://github.com/HowJMay/golang-arm-assebmly-demo
Reference
https://golang.org/cmd/asm/
https://golang.org/doc/asm
https://developer.arm.com/architectures/instruction-sets/simd-isas/neon
https://en.wikichip.org/wiki/arm/armv8#ARMv8_Extensions_and_Processor_Features
https://www.cockroachlabs.com/blog/the-cost-and-complexity-of-cgo/
https://www.youtube.com/watch?v=9jpnFmJr2PE

More Related Content

PDF
COSCUP 2016 - LLVM 由淺入淺
PDF
Android C Library: Bionic 成長計畫
PDF
2016-04-07-清大-國際化開源專案技術實務與經驗分享
PDF
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
PDF
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
PPS
基于Android ndk的软件开发简介 放映
PDF
Gtk to qt
PPTX
Qt 入門就上手 !!
COSCUP 2016 - LLVM 由淺入淺
Android C Library: Bionic 成長計畫
2016-04-07-清大-國際化開源專案技術實務與經驗分享
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2016 Workshop: 用 Docker 架設班級 git-it 練習環境
基于Android ndk的软件开发简介 放映
Gtk to qt
Qt 入門就上手 !!

What's hot (18)

PDF
PIME - 用 Python 快速開發 Windows 的中文輸入法 (COSCUP 2015)
PDF
icecream / icecc:分散式編譯系統簡介
PDF
Light talk @ coscup 2011 : Incremental Global Prelink for Android
PPTX
GIT實務操作與理論
PPTX
Gdb实用技巧
PPT
Grails敏捷项目开发
PPT
Go语言: 互联网时代的C
ODP
igdshare 110220: LuaJIT intro
PDF
Python&GUI
PDF
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
PDF
Guide to GStreamer Application Development Manual: CH1 to CH10
PDF
開發學校雲端服務的奇技淫巧(Tips for Building Third-Party School Service)
PDF
How to debug using GDB
PPT
P2 p加速分析与设计
PDF
GNU gettext簡介 - 以C語言為範例
PPTX
艾鍗學院-單晶片韌體開發- LCM模組實驗
PDF
用Cython封装c++代码为python模块的一点经验
PPTX
这年头,你只需要懂Node webkit
PIME - 用 Python 快速開發 Windows 的中文輸入法 (COSCUP 2015)
icecream / icecc:分散式編譯系統簡介
Light talk @ coscup 2011 : Incremental Global Prelink for Android
GIT實務操作與理論
Gdb实用技巧
Grails敏捷项目开发
Go语言: 互联网时代的C
igdshare 110220: LuaJIT intro
Python&GUI
PIME - 用 Python 和 JavaScript 快速開發 Windows 的中文輸入法
Guide to GStreamer Application Development Manual: CH1 to CH10
開發學校雲端服務的奇技淫巧(Tips for Building Third-Party School Service)
How to debug using GDB
P2 p加速分析与设计
GNU gettext簡介 - 以C語言為範例
艾鍗學院-單晶片韌體開發- LCM模組實驗
用Cython封装c++代码为python模块的一点经验
这年头,你只需要懂Node webkit
Ad

Similar to 在 golang 中透過組合語言實作 SIMD (20)

PDF
COSCUP2016 - LLVM框架、由淺入淺
PDF
PPTX
为啥别读HotSpot VM的源码(2012-03-03)
PDF
Accelerating or Complicating PHP execution by LLVM Compiler Infrastructure
PPTX
Erlang and HTML5
PPT
手把手教你玩转Gdb
PPTX
Sun JDK 1.6内存管理 -调优篇
PPTX
181201_CoAP_coding365
PDF
移动开发的性能优化
PDF
Arduino 底層原始碼解析心得
PPT
腾讯大讲堂46 自由cgi之路v3
PPT
腾讯大讲堂46 自由cgi之路v3
PDF
Sigreturn Oriented Programming
PPT
编码大全
PPTX
網路技術心得分享
DOC
嵌入式inux應用專題文件-智慧家庭系統
PDF
recover_pdb 原理與介紹
PPTX
Avm2虚拟机浅析与as3性能优化
PPTX
Avm2虚拟机浅析与as3性能优化(陈士凯)
PPTX
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
COSCUP2016 - LLVM框架、由淺入淺
为啥别读HotSpot VM的源码(2012-03-03)
Accelerating or Complicating PHP execution by LLVM Compiler Infrastructure
Erlang and HTML5
手把手教你玩转Gdb
Sun JDK 1.6内存管理 -调优篇
181201_CoAP_coding365
移动开发的性能优化
Arduino 底層原始碼解析心得
腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3
Sigreturn Oriented Programming
编码大全
網路技術心得分享
嵌入式inux應用專題文件-智慧家庭系統
recover_pdb 原理與介紹
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
Ad

在 golang 中透過組合語言實作 SIMD