SlideShare a Scribd company logo
1 of 16
Download to read offline
WASM(WebAssembly)入門
ペアリング演算やってみた
2017/9/8
光成滋生
• WASM = ブラウザで高速なアプリケーションを実行す
るためのバイトコード、ツール
• 現在開発中(のため様々なものがよく変わる)
• 一次資料(http://webassembly.org/)が重要
• 少し歴史
• その昔のIEのActiveX(x86)
• 2000年ActionScript(Flash)
• 2010年ChromeでNaCl(x86/arm)
• 2013年Firefoxでasm.js(汎用), ChromeでPNaCl(汎用)
• 2014年HTML5
• 2017年PNaClからWebAssemblyへ
• WebGL, WebGPU(Apple), NXT(Google)
• deeplearn.js https://pair-code.github.io/deeplearnjs/
• WebDNN https://mil-tokyo.github.io/webdnn/ja/ 2 / 16
概要
• デザインゴール
• 高速で、安全で、well-defined
• ハードウェア, 言語, プラットフォームに依存しない
• open
• https://webassembly.github.io/spec/
• 仮想マシン
• スタックマシン
• レジスタはi32, i64, f32, f64, 将来SIMDも
• 通常の四則演算, 論理演算をサポート
• ビットを数える(popcnt), clz, ctzがある
• 浮動小数→整数変換(ceil, floor, trunc, nearest)
• 分岐, min, max
• carry演算, 64x64→128bit乗算, 128/64bit除算がない
3 / 16
WASMの仕様
• C/C++からWASM
• emscripten, emcc
• アセンブラ, 逆アセンブルなど各種変換
• WABT(https://github.com/WebAssembly/wabt/)
• wast2wasm, wasm2wast
• https://cdn.rawgit.com/WebAssembly/wabt/7e56ca56/demo/
wast2wasm/ (デモ)
• LLVMからWASM
• llc foo.ll -march=wasm32
• アセンブリコードをwastに変換(s2wasm)
• ClangからWASMの直接出力?
• いろいろあるが流動的なので本家を見て
4 / 16
様々なツール
• wat(S式)をwast2wasmでwasmファイルにする
• ブラウザから見えるようにしてsquare.htmlを開く
• Firefox, Chrome, Edge(about:configで拡張JavaScript)対応
• AndroidのChromeもOK
5 / 16
値を2乗するwat
;; square(i32 i) -> i32
(module
(func (export "square") (param $i i32) (result i32)
(i32.mul (get_local $i) (get_local $i))))
wast2wasm square.wat -o square.wasm
• square.wasmをfetchしてインスタンス化
6 / 16
square.html
<html><head><script>
fetch('square.wasm')
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.compile(buffer))
.then(module => new WebAssembly.Instance(module))
.then(instance => {
let square = instance.exports.square
let button = document.getElementById('run')
let x = 15
button.value = 'square of ' + x + ' ='
button.addEventListener('click', function() {
document.getElementById('result').innerText = square(x)
})
})
</script></head><body>
<input type="button" id="run" value="loading WebAssembly"/>
<span id="result">0</span>
</body></html>
• Emscripten SDKのインストール
• main()つきCのソース
• buildしてブラウザで表示
7 / 16
Cサンプル
git clone https://github.com/juj/emsdk.git
cd emsdk
./emsdk install sdk-incoming-64bit binaryen-master-64bit
./emsdk activate sdk-incoming-64bit binaryen-master-64bit
#include <stdio.h>
int add(int x, int y) { return x + y; }
int main() { printf("add %d¥n", add(3, 5)); }
emcc t.c -s WASM=1 -o t.html
emrun --no_browser --port 8080 .
• ペアリング暗号ライブラリmclをWASMで動かしたい
• https://github.com/herumi/mcl/
• 要OpenSSL + GMP(多倍長演算ライブラリ)+ LLVM
• OpenSSL
• ハッシュ関数だけなので自前のSHA1で代用して使わない
• あとでSHA2にする
• clock_gettime()がエラー
• gettimeofdayで代用
• GMP
• WASM用のがあったので試すがbuildできるが動かなかった
• LLVMは
8 / 16
目標
• 当初の期待
• mclはLLVMビットコードを出力
• x86/x64/arm/arm64専用コードはllcが生成(or Xbyak)
• -march=wasm32すればよいだけと思っていた
• 現時点での制限
• 64bit整数より大きい整数を扱えない
• 本来のLLVMはi256(256bit整数)などが使える
• 内部で自動的に64bit x 4(32bit x 8)の演算に変換される
• 32bit×32bit→64bit乗算しかない
• そもそもcarry演算命令が無いのでCで書いてもそんなに変わ
らないのでは(最適化コンパイラを信じれば)
9 / 16
当てが外れたLLVM for WASM
Unsupported: %z = mul i128 %x, %y
LLVM ERROR: Binary operator type not yet supported for integer types larger
than 64 bits
• WASM仕様再掲
• carry演算, 64x64→128bit乗算, 128/64bit除算がない
• add/subは64bit単位で加算
• x + y < yならcarry発生として繰り上げ
10 / 16
多倍長演算部分をCで再実装
template<class T>
T addN(T *z, const T *x, const T *y, size_t n) {
T c = 0;
for (size_t i = 0; i < n; i++) {
T xc = x[i] + c;
if (xc < c) {
z[i] = y[i];
} else {
xc += y[i];
c = y[i] > xc ? 1 : 0;
z[i] = xc;
} }
return c; }
• 32x32→64, 64/32→32を使って実装
• 結構めんどい & 遅い(せっかくの64bit環境が…)
• 将来WASMがサポートすれば1命令にできる
• とりあえず出来た
• https://github.com/herumi/mcl/blob/master/include/mcl/vint.
hpp
• pure C++
• 四則演算と論理演算サポート
• 巾乗
• mod pにおける逆元
• gcd, Legendreシンボル
• 素数判定
11 / 16
64 x 64→128, 128 / 64→64
• CPU : Core i7-7500U 2.7GHz(Skylake)
• native : gcc 5.4.0
• emcc : clang 4.0.0(emscripten 1.37.15)
• -DMCL_USE_VINT -DMCL_VINT_64BIT_PORTABLE
• Vint w/ 64-bit mulは64 x 64→128乗算を使うか/使わないか
• 将来WASMが対応すれば切り替えられる
• ので今はwastを直接書いてがんばらない
• demo for Broswer
• http://herumi.github.io/mcl/demo/pairing.html
12 / 16
性能
Xbyak LLVM Vint w/
64-bit mul
Vint wo/
64-bit mul
Firefox
55
Chrome 61 Edge
msec 0.35 0.50 1.37 2.3 3.19 3.42 5.48
• モジュール化オプションとexportする関数を指定
• -s WASM=1 -s "MODULARIZE=1" -s
"EXPORTED_FUNCTIONS=[$(EXPORTED_MCL)]"
• EXPORTEDMCLはヘッダファイルから関数を自動抽出した
• ついでにJS用プロトタイプ宣言用ファイルも生成
• int, pointerは全てnumberに(stringもあるが今回は避けた)
13 / 16
JSから呼び出す
// bn.h
void mclBnFr_setInt(mclBnFr *y, int64_t x);
int mclBnFr_setStr(mclBnFr *x, const char *buf,
size_t bufSize, int ioMode);
// exported-mcl.js
mclBnFr_setInt =
mod.cwrap('mclBnFr_setInt', 'null', ['number', 'number', ])
_mclBnFr_setStr = mod.cwrap('mclBnFr_setStr',
'number', ['number', 'number', 'number', 'number', ])
• moduleインスタンスを作るsetupWASM
• stackやheapの面倒を見てくれる
14 / 16
moduleインスタンスを作る
function setupWasm(fileName, nameSpace, setupFct) {
var mod = {}
fetch(fileName)
.then(response => response.arrayBuffer())
.then(buffer => new Uint8Array(buffer))
.then(binary => {
mod['wasmBinary'] = binary
mod['onRuntimeInitialized'] = function() {
setupFct(mod, nameSpace)
}
Module(mod)
})
return mod
}
• mod._malloc()の返り値はexportされた関数に渡せる
• mod._free()する必要あり
• destructorのないJSではちょっと辛い
15 / 16
heapを使う
• moduleインスタンスのRuntimeを使う
• stackSave/stackRestoreでstackの保存と復元
• mod.HEAP8にstackAllocで取得した位置を利用する
• _malloc, _freeを使ってもよい
16 / 16
JSのstringをCのconst char*に変換
// bufはstring
gen_setStr = function(func) {
return function(x, buf, ioMode) {
if (ioMode == null) { ioMode = 0 }
var stack = mod.Runtime.stackSave()
var pos = mod.Runtime.stackAlloc(buf.length)
for (var i = 0; i < buf.length; i++) {
mod.HEAP8[pos + i] = buf.charCodeAt(i)
}
r = func(x, pos, buf.length, ioMode)
mod.Runtime.stackRestore(stack)
}
}

More Related Content

What's hot

zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてzk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてts21
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Masahito Zembutsu
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法Higashiyama Masahiko
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向shigeki_ohtsu
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 

What's hot (20)

Rolling hash
Rolling hashRolling hash
Rolling hash
 
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてzk-SNARKsの仕組みについて
zk-SNARKsの仕組みについて
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法
 
SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向SSL/TLSの基礎と最新動向
SSL/TLSの基礎と最新動向
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 

Similar to WASM(WebAssembly)入門 ペアリング演算やってみた

TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみるYasuhiro Yoshimura
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?Yosuke Onoue
 
大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話terurou
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~Akira Inoue
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
JAMstackは眠らない
JAMstackは眠らないJAMstackは眠らない
JAMstackは眠らないKuniyoshi Tone
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたことMITSUNARI Shigeo
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Akira Inoue
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...de:code 2017
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_publicKazuaki Ishizaki
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめNVIDIA Japan
 
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜gree_tech
 

Similar to WASM(WebAssembly)入門 ペアリング演算やってみた (20)

TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
 
大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話
 
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
JAMstackは眠らない
JAMstackは眠らないJAMstackは眠らない
JAMstackは眠らない
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
Zynga
ZyngaZynga
Zynga
 
Aws privte20110406 arai
Aws privte20110406 araiAws privte20110406 arai
Aws privte20110406 arai
 
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
 
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめC#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
 
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
 

More from MITSUNARI Shigeo

範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコルMITSUNARI Shigeo
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advancedMITSUNARI Shigeo
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法MITSUNARI Shigeo
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装MITSUNARI Shigeo
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介MITSUNARI Shigeo
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 

More from MITSUNARI Shigeo (20)

範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
 
暗認本読書会11
暗認本読書会11暗認本読書会11
暗認本読書会11
 
暗認本読書会10
暗認本読書会10暗認本読書会10
暗認本読書会10
 
暗認本読書会9
暗認本読書会9暗認本読書会9
暗認本読書会9
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
暗認本読書会8
暗認本読書会8暗認本読書会8
暗認本読書会8
 
暗認本読書会7
暗認本読書会7暗認本読書会7
暗認本読書会7
 
暗認本読書会6
暗認本読書会6暗認本読書会6
暗認本読書会6
 
暗認本読書会5
暗認本読書会5暗認本読書会5
暗認本読書会5
 
暗認本読書会4
暗認本読書会4暗認本読書会4
暗認本読書会4
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 

Recently uploaded

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 

Recently uploaded (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

WASM(WebAssembly)入門 ペアリング演算やってみた

  • 2. • WASM = ブラウザで高速なアプリケーションを実行す るためのバイトコード、ツール • 現在開発中(のため様々なものがよく変わる) • 一次資料(http://webassembly.org/)が重要 • 少し歴史 • その昔のIEのActiveX(x86) • 2000年ActionScript(Flash) • 2010年ChromeでNaCl(x86/arm) • 2013年Firefoxでasm.js(汎用), ChromeでPNaCl(汎用) • 2014年HTML5 • 2017年PNaClからWebAssemblyへ • WebGL, WebGPU(Apple), NXT(Google) • deeplearn.js https://pair-code.github.io/deeplearnjs/ • WebDNN https://mil-tokyo.github.io/webdnn/ja/ 2 / 16 概要
  • 3. • デザインゴール • 高速で、安全で、well-defined • ハードウェア, 言語, プラットフォームに依存しない • open • https://webassembly.github.io/spec/ • 仮想マシン • スタックマシン • レジスタはi32, i64, f32, f64, 将来SIMDも • 通常の四則演算, 論理演算をサポート • ビットを数える(popcnt), clz, ctzがある • 浮動小数→整数変換(ceil, floor, trunc, nearest) • 分岐, min, max • carry演算, 64x64→128bit乗算, 128/64bit除算がない 3 / 16 WASMの仕様
  • 4. • C/C++からWASM • emscripten, emcc • アセンブラ, 逆アセンブルなど各種変換 • WABT(https://github.com/WebAssembly/wabt/) • wast2wasm, wasm2wast • https://cdn.rawgit.com/WebAssembly/wabt/7e56ca56/demo/ wast2wasm/ (デモ) • LLVMからWASM • llc foo.ll -march=wasm32 • アセンブリコードをwastに変換(s2wasm) • ClangからWASMの直接出力? • いろいろあるが流動的なので本家を見て 4 / 16 様々なツール
  • 5. • wat(S式)をwast2wasmでwasmファイルにする • ブラウザから見えるようにしてsquare.htmlを開く • Firefox, Chrome, Edge(about:configで拡張JavaScript)対応 • AndroidのChromeもOK 5 / 16 値を2乗するwat ;; square(i32 i) -> i32 (module (func (export "square") (param $i i32) (result i32) (i32.mul (get_local $i) (get_local $i)))) wast2wasm square.wat -o square.wasm
  • 6. • square.wasmをfetchしてインスタンス化 6 / 16 square.html <html><head><script> fetch('square.wasm') .then(response => response.arrayBuffer()) .then(buffer => WebAssembly.compile(buffer)) .then(module => new WebAssembly.Instance(module)) .then(instance => { let square = instance.exports.square let button = document.getElementById('run') let x = 15 button.value = 'square of ' + x + ' =' button.addEventListener('click', function() { document.getElementById('result').innerText = square(x) }) }) </script></head><body> <input type="button" id="run" value="loading WebAssembly"/> <span id="result">0</span> </body></html>
  • 7. • Emscripten SDKのインストール • main()つきCのソース • buildしてブラウザで表示 7 / 16 Cサンプル git clone https://github.com/juj/emsdk.git cd emsdk ./emsdk install sdk-incoming-64bit binaryen-master-64bit ./emsdk activate sdk-incoming-64bit binaryen-master-64bit #include <stdio.h> int add(int x, int y) { return x + y; } int main() { printf("add %d¥n", add(3, 5)); } emcc t.c -s WASM=1 -o t.html emrun --no_browser --port 8080 .
  • 8. • ペアリング暗号ライブラリmclをWASMで動かしたい • https://github.com/herumi/mcl/ • 要OpenSSL + GMP(多倍長演算ライブラリ)+ LLVM • OpenSSL • ハッシュ関数だけなので自前のSHA1で代用して使わない • あとでSHA2にする • clock_gettime()がエラー • gettimeofdayで代用 • GMP • WASM用のがあったので試すがbuildできるが動かなかった • LLVMは 8 / 16 目標
  • 9. • 当初の期待 • mclはLLVMビットコードを出力 • x86/x64/arm/arm64専用コードはllcが生成(or Xbyak) • -march=wasm32すればよいだけと思っていた • 現時点での制限 • 64bit整数より大きい整数を扱えない • 本来のLLVMはi256(256bit整数)などが使える • 内部で自動的に64bit x 4(32bit x 8)の演算に変換される • 32bit×32bit→64bit乗算しかない • そもそもcarry演算命令が無いのでCで書いてもそんなに変わ らないのでは(最適化コンパイラを信じれば) 9 / 16 当てが外れたLLVM for WASM Unsupported: %z = mul i128 %x, %y LLVM ERROR: Binary operator type not yet supported for integer types larger than 64 bits
  • 10. • WASM仕様再掲 • carry演算, 64x64→128bit乗算, 128/64bit除算がない • add/subは64bit単位で加算 • x + y < yならcarry発生として繰り上げ 10 / 16 多倍長演算部分をCで再実装 template<class T> T addN(T *z, const T *x, const T *y, size_t n) { T c = 0; for (size_t i = 0; i < n; i++) { T xc = x[i] + c; if (xc < c) { z[i] = y[i]; } else { xc += y[i]; c = y[i] > xc ? 1 : 0; z[i] = xc; } } return c; }
  • 11. • 32x32→64, 64/32→32を使って実装 • 結構めんどい & 遅い(せっかくの64bit環境が…) • 将来WASMがサポートすれば1命令にできる • とりあえず出来た • https://github.com/herumi/mcl/blob/master/include/mcl/vint. hpp • pure C++ • 四則演算と論理演算サポート • 巾乗 • mod pにおける逆元 • gcd, Legendreシンボル • 素数判定 11 / 16 64 x 64→128, 128 / 64→64
  • 12. • CPU : Core i7-7500U 2.7GHz(Skylake) • native : gcc 5.4.0 • emcc : clang 4.0.0(emscripten 1.37.15) • -DMCL_USE_VINT -DMCL_VINT_64BIT_PORTABLE • Vint w/ 64-bit mulは64 x 64→128乗算を使うか/使わないか • 将来WASMが対応すれば切り替えられる • ので今はwastを直接書いてがんばらない • demo for Broswer • http://herumi.github.io/mcl/demo/pairing.html 12 / 16 性能 Xbyak LLVM Vint w/ 64-bit mul Vint wo/ 64-bit mul Firefox 55 Chrome 61 Edge msec 0.35 0.50 1.37 2.3 3.19 3.42 5.48
  • 13. • モジュール化オプションとexportする関数を指定 • -s WASM=1 -s "MODULARIZE=1" -s "EXPORTED_FUNCTIONS=[$(EXPORTED_MCL)]" • EXPORTEDMCLはヘッダファイルから関数を自動抽出した • ついでにJS用プロトタイプ宣言用ファイルも生成 • int, pointerは全てnumberに(stringもあるが今回は避けた) 13 / 16 JSから呼び出す // bn.h void mclBnFr_setInt(mclBnFr *y, int64_t x); int mclBnFr_setStr(mclBnFr *x, const char *buf, size_t bufSize, int ioMode); // exported-mcl.js mclBnFr_setInt = mod.cwrap('mclBnFr_setInt', 'null', ['number', 'number', ]) _mclBnFr_setStr = mod.cwrap('mclBnFr_setStr', 'number', ['number', 'number', 'number', 'number', ])
  • 14. • moduleインスタンスを作るsetupWASM • stackやheapの面倒を見てくれる 14 / 16 moduleインスタンスを作る function setupWasm(fileName, nameSpace, setupFct) { var mod = {} fetch(fileName) .then(response => response.arrayBuffer()) .then(buffer => new Uint8Array(buffer)) .then(binary => { mod['wasmBinary'] = binary mod['onRuntimeInitialized'] = function() { setupFct(mod, nameSpace) } Module(mod) }) return mod }
  • 15. • mod._malloc()の返り値はexportされた関数に渡せる • mod._free()する必要あり • destructorのないJSではちょっと辛い 15 / 16 heapを使う
  • 16. • moduleインスタンスのRuntimeを使う • stackSave/stackRestoreでstackの保存と復元 • mod.HEAP8にstackAllocで取得した位置を利用する • _malloc, _freeを使ってもよい 16 / 16 JSのstringをCのconst char*に変換 // bufはstring gen_setStr = function(func) { return function(x, buf, ioMode) { if (ioMode == null) { ioMode = 0 } var stack = mod.Runtime.stackSave() var pos = mod.Runtime.stackAlloc(buf.length) for (var i = 0; i < buf.length; i++) { mod.HEAP8[pos + i] = buf.charCodeAt(i) } r = func(x, pos, buf.length, ioMode) mod.Runtime.stackRestore(stack) } }