simd.js(ecmascript 7)

28
HTML5とか勉強会#60 20150929ECMAScript 7 - SIMD.js -

Upload: hiroshi-kawada

Post on 16-Feb-2017

3.502 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: SIMD.js(ECMAScript 7)

HTML5とか勉強会#60 2015年09月29日

ECMAScript 7 - SIMD.js -

Page 2: SIMD.js(ECMAScript 7)

ふろしき

ふろしきです。先月にNTTを卒業して、某お絵かき系サービスの中の人になりました!!

東京Web Performance

html5j パフォーマンス部

(先月から)ピクシブ株式会社

自己紹介

Page 3: SIMD.js(ECMAScript 7)

「東京Webパフォーマンス」というイベント ピクシブのオフィスでひっそりとやっています

Webのパフォーマンスを改善する新しい機能を味見しまくる そんなイベントを不定期で開いています

Page 4: SIMD.js(ECMAScript 7)

for文の話をしよう突然だが…

Page 5: SIMD.js(ECMAScript 7)

普通のfor文による繰り返し、現場ではタブー感が

プログラミングの授業で習うfor文。 しかし世の言語は、これを使わせないようにする傾向にあります…なぜでしょう?

// 普通のfor文で各データに加算処理 for( var i=0; i<items.length ; i++ ) { items[i].add(count); }

正解… なんだけど??

// イテレーターで各データに加算処理 for( let item of items ) { item.add(count); }

なぜ、わざわざ こんな方法が…

Page 6: SIMD.js(ECMAScript 7)

パフォーマンスの問題を作ることがある!?

普通のfor文は、場合によってはパフォーマンスに問題を作ることがあります。 ループ文で処理する対象の特性にあった、対策が求められているのです

array[100000000]

繰り返し実装がむき出し

な処理

iterator

効率よい データストア 繰り返し

実装を隠蔽!!

データベースに接

続しようが

  Generatorだ

ろうが

    Immuta

ble.jsだろうが

な処理

何を使ったってい

い!!

API

Page 7: SIMD.js(ECMAScript 7)

ループはいつだって辛い 出来る限りループは効率化したい

Page 8: SIMD.js(ECMAScript 7)

SIMD というアプローチについて

Page 9: SIMD.js(ECMAScript 7)

例えば、データAとデータBを足した結果をだしたい時、データが2つならカンタン

データA データB+

Page 10: SIMD.js(ECMAScript 7)

しかしそれが、あるひとかたまりのデータ同士を足し算したいときは?

データA[0] データB[0]

データA[1] データB[1]

データA[2] データB[2]

データA[3] データB[3]

データA[4] データB[4]

Page 11: SIMD.js(ECMAScript 7)

ループが避けられない

当然、あの忌々しいループが必要になってしまいます。

データA[0]

データA[1]

データA[2]

データA[3]

データA[4]

1回目 加算命令

加算命令

加算命令

加算命令

加算命令

2回目

3回目

4回目

5回目

データB[0]

データB[1]

データB[2]

データB[3]

データB[4]

Page 12: SIMD.js(ECMAScript 7)

SIMDは複数データの加算を1命令で実行!!

SIMDでは、2つの大量データ同士の計算について、 通常はループでやるような処理を、一回の命令を実行できるようにしパフォーマンスを改善します

処理

Single Instruction

Multi Data

データA[0]

データA[1]

データA[2]

データA[3]

データA[4]

データB[0]

データB[1]

データB[2]

データB[3]

データB[4]

Page 13: SIMD.js(ECMAScript 7)

SIMD.js

Page 14: SIMD.js(ECMAScript 7)

SIMD.jsとは? -> part of ECMAScript7

SIMD.jsは、Intelらが中心となり仕様の策定を進めている JavaScriptでSIMDを扱う方法です。ECMAScript7に追加される予定です

→ Firefox

→ Edge

→ WebKit

←Intel(

2014年ご

ろ)

Page 15: SIMD.js(ECMAScript 7)

SIMDはCPUの機能、それをJSのAPIから触る

厳密には複数のデータ領域を一回の命令で操作できるというCPUの機能で、 JSでラップされたAPIを経由して扱います

データ[0]

データ[1]

データ[2]

データ[3]

データ[4]

メモリ

CPU

ユーザーランド

JavaScript による処理

ブラウザ

JavaScript API

CPU/メモリの 低級な仕組みに

バイパス

高級な APIによる ラップ

Page 16: SIMD.js(ECMAScript 7)

デメリット

あらかじめ準備された命令しか使えないため、やや柔軟性に欠けますが…、ハマれば高速です

データ[0]

データ[1]

データ[2]

データ[3]

データ[4]

メモリ

CPU

加算

減算

コピー

XORShift

なんでもできるわけじゃない… ループ文を置き換えれるなんて そんなカンタンなものじゃない!!

Page 17: SIMD.js(ECMAScript 7)

Get Start

Page 18: SIMD.js(ECMAScript 7)

データ領域の確保

メモリ上から、SIMDに適したデータ領域を確保し初期化します

1.0

2.0

3.0

4.0

5.0

6.0

7.0

8.0

hoge fuga

var hoge = SIMD.Float32x4(1.0,2.0,3.0,4.0); var fuga = SIMD.Float32x4(5.0,6.0,7.0,8.0);

Page 19: SIMD.js(ECMAScript 7)

計算する

計算して結果を格納します

var piyo = SIMD.Float32x4.add(hoge,fuga);

1.0

2.0

3.0

4.0

5.0

6.0

7.0

8.0

hoge fuga

6.0

8.0

10.0

12.0

piyo

Page 20: SIMD.js(ECMAScript 7)

出力する

結果を出力します

var foo = SIMD.Float32x4.extractLane(piyo,0);

6.0

8.0

10.0

12.0

piyo

6.0foo

Page 21: SIMD.js(ECMAScript 7)

出力する

結果を出力します

SIMD.Float32x4.extractLane(piyo,0);

6.0

8.0

10.0

12.0

piyo

6.0

DEMO

Page 22: SIMD.js(ECMAScript 7)

もう少しだけ実用的に

Page 23: SIMD.js(ECMAScript 7)

waifu2xのJS実装を改善

画像を拡大した時のあのギザギザ感をなくし シャープにみせるとあるアルゴリズムをSIMDで改善します!!

拡大 waifu2x

Page 24: SIMD.js(ECMAScript 7)

waifu2xのJS実装を改善

画像を拡大した時のあのギザギザ感をなくし シャープにみせるとあるアルゴリズムをSIMDで改善します!!

拡大 waifu2xDEMO

Page 25: SIMD.js(ECMAScript 7)

http://inside.pixiv.net/entry/2015/07/28/230317

今回やったデモの内容は、こちらに詳細があります!!

Page 26: SIMD.js(ECMAScript 7)

まとめ

Page 27: SIMD.js(ECMAScript 7)

まとめ

ブラウザ上でも、二次元画像みたいなバイナリを効率的に処理する術が増えてて嬉しいです

・WebAssemblyと同じ文脈で語られる  パフォーマンス改善技術。 ・大量のデータ同士の計算を  ループ文無しでさせることができる。 ・CPUのSIMD命令を、JavaScript APIから  扱うことができる。 ・ぶっちゃけ人間が使うやつじゃないですね!

Page 28: SIMD.js(ECMAScript 7)

Thank You!

@_ furoshiki