Suche senden
Hochladen
WASM(WebAssembly)入門 ペアリング演算やってみた
•
4 gefällt mir
•
3,317 views
MITSUNARI Shigeo
Folgen
社内勉強会資料
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 16
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
Empfohlen
明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについて
ts21
Marp Tutorial
Marp Tutorial
Rui Watanabe
楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり
MITSUNARI Shigeo
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
Bitcoinを技術的に理解する
Bitcoinを技術的に理解する
Kenji Urushima
双対性
双対性
Yoichi Iwata
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
MITSUNARI Shigeo
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
MITSUNARI Shigeo
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
充足可能性問題のいろいろ
充足可能性問題のいろいろ
Hiroshi Yamashita
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
Weitere ähnliche Inhalte
Was ist angesagt?
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについて
ts21
Marp Tutorial
Marp Tutorial
Rui Watanabe
楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり
MITSUNARI Shigeo
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
Bitcoinを技術的に理解する
Bitcoinを技術的に理解する
Kenji Urushima
双対性
双対性
Yoichi Iwata
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
MITSUNARI Shigeo
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
MITSUNARI Shigeo
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
充足可能性問題のいろいろ
充足可能性問題のいろいろ
Hiroshi Yamashita
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
Was ist angesagt?
(20)
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
動的計画法を極める!
動的計画法を極める!
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
自動定理証明の紹介
自動定理証明の紹介
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについて
Marp Tutorial
Marp Tutorial
楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり
冬のLock free祭り safe
冬のLock free祭り safe
Bitcoinを技術的に理解する
Bitcoinを技術的に理解する
双対性
双対性
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
中3女子でもわかる constexpr
中3女子でもわかる constexpr
充足可能性問題のいろいろ
充足可能性問題のいろいろ
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
Ähnlich wie WASM(WebAssembly)入門 ペアリング演算やってみた
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
Yasuhiro Yoshimura
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
Yosuke Onoue
大規模なギョームシステムに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. ~
Akira Inoue
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Ryo Nakamaru
JAMstackは眠らない
JAMstackは眠らない
Kuniyoshi Tone
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
H2O Space. Co., Ltd.
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 2012
Takuro Iizuka
Zynga
Zynga
awsadvantageseminar
Aws privte20110406 arai
Aws privte20110406 arai
awsadovantageseminar
[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最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
Yoshifumi Kawai
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
Kazuaki Ishizaki
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
NVIDIA Japan
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
gree_tech
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustSystems Corporation
Ähnlich wie WASM(WebAssembly)入門 ペアリング演算やってみた
(20)
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話
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 非同期ストリーム
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
JAMstackは眠らない
JAMstackは眠らない
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Zynga
Zynga
Aws privte20110406 arai
Aws privte20110406 arai
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
[AI05] 目指せ、最先端 AI 技術の実活用!Deep Learning フレームワーク 「Microsoft Cognitive Toolkit 」...
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
C#, C/CLI と CUDAによる画像処理ことはじめ
C#, C/CLI と CUDAによる画像処理ことはじめ
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
サーバサイドの並行プログラミング〜かんたんマルチスレッドプログラミング〜
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
Mehr von MITSUNARI Shigeo
範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
MITSUNARI Shigeo
暗認本読書会13 advanced
暗認本読書会13 advanced
MITSUNARI Shigeo
暗認本読書会12
暗認本読書会12
MITSUNARI Shigeo
暗認本読書会11
暗認本読書会11
MITSUNARI Shigeo
暗認本読書会10
暗認本読書会10
MITSUNARI Shigeo
暗認本読書会9
暗認本読書会9
MITSUNARI Shigeo
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
MITSUNARI Shigeo
暗認本読書会8
暗認本読書会8
MITSUNARI Shigeo
暗認本読書会7
暗認本読書会7
MITSUNARI Shigeo
暗認本読書会6
暗認本読書会6
MITSUNARI Shigeo
暗認本読書会5
暗認本読書会5
MITSUNARI Shigeo
暗認本読書会4
暗認本読書会4
MITSUNARI Shigeo
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
MITSUNARI Shigeo
私とOSSの25年
私とOSSの25年
MITSUNARI Shigeo
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
MITSUNARI Shigeo
楕円曲線と暗号
楕円曲線と暗号
MITSUNARI Shigeo
HPC Phys-20201203
HPC Phys-20201203
MITSUNARI Shigeo
BLS署名の実装とその応用
BLS署名の実装とその応用
MITSUNARI Shigeo
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
MITSUNARI Shigeo
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
Mehr von MITSUNARI Shigeo
(20)
範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
暗認本読書会13 advanced
暗認本読書会13 advanced
暗認本読書会12
暗認本読書会12
暗認本読書会11
暗認本読書会11
暗認本読書会10
暗認本読書会10
暗認本読書会9
暗認本読書会9
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
暗認本読書会8
暗認本読書会8
暗認本読書会7
暗認本読書会7
暗認本読書会6
暗認本読書会6
暗認本読書会5
暗認本読書会5
暗認本読書会4
暗認本読書会4
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
私とOSSの25年
私とOSSの25年
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
楕円曲線と暗号
楕円曲線と暗号
HPC Phys-20201203
HPC Phys-20201203
BLS署名の実装とその応用
BLS署名の実装とその応用
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
1.
WASM(WebAssembly)入門 ペアリング演算やってみた 2017/9/8 光成滋生
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) } }
Jetzt herunterladen