Burstを使ってSHA-256のハッシュ計算を高速に行う話

2K Views

March 04, 21

スライド概要

Burstコンパイラーを使用し、ILをLLVMを介してネイティブコードへコンパイルすることにより処理を最適化することが出来ます。今回は「ファイルを読み込んでSHA-256のハッシュ値を計算する」をお題に Burst1.5.0 で導入されたDirect Callを使った方法や、裏技的にメモリマップトファイルを使った方法を紹介します。

講演者: 名雪 通

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Burstを使って SHA-256のハッシュ計算を 高速に行う話 ユニティ・テクノロジーズ・ジャパン 名雪 通

2.

本日のソースコード: https://github.com/tnayuki/Unity-BurstSHA256

3.

Burst

4.

ご存知ですよね?

5.

https://learning.unity3d.jp/4968/

6.

Burstは速い

7.

しかし

8.

“大いなるスピードには大いなる責任が伴う” ‒Toru Nayuki

9.

いろいろ使えないものも多いし、 基本的にはメモリ→メモリ的な処理になる

10.

ファイル入力ぐらいしたい

11.

お題 ファイル(1GBのランダムデータ)を読み込んで SHA-256のハッシュ値を計算する

12.

Burst化したジョブからは ファイル読み込みできない (Fileクラスが使えないので) ↓ ファイルを読み込んでから Burstコンパイルされたコードを呼ぶ

13.

こんな感じでSHA-256のハッシュを計算するルーチンを構造体として実装して、 構造体とstaticメソッドにBurstCompile属性をつける

14.

こんな感じで64KBずつファイルから読み込んで BurstでコンパイルされたSHA-256のルーチンを呼ぶ

15.

Burstコンパイル無効

16.

Burstコンパイル有効

17.

ところで

18.

お気づきだろうか?

19.

Burstでコンパイルされたメソッドを普通に呼んでいる

20.

以前はdelegateを使う必要があった

21.

Burst 1.5.0から使えるようになったDirect Call ※ILのポストプロセスによって実現されている

22.

https://learning.unity3d.jp/5005/

23.

実はジョブ向け?の ファイル読み込みのための仕組みがある

24.

AsyncReadManager

25.

読み込むファイル名 ファイルの読み込む部分とバッファを 構造体の配列にして渡す

26.

ファイル名がstring型なのでBurstのジョブから呼べない ファイルの読み込む部分とバッファを 構造体の配列にして渡す 全部まとめてしか完了状態がわからない ジョブの中でファイルを ストリーミング的に読み込むには向いていない?

27.

ジョブの中でファイルが読み込めない

28.

なら OSに読ませればいいじゃない

29.

メモリマップトファイルを使ってみよう

30.

メモリマップトファイルを使ってみよう ※ここからの話はすべてのプラットフォームで対応可能な方法ではありません

31.

メモリマップトファイルとは 近代OSの仮想メモリ機構の一部として実装されている、 ファイルをプロセスのアドレス空間に直接マッピングする仕組み。 スワップファイルの機構も同じ仕組みで実装されている(ことが多い)。

32.

メモリマップトファイルとは 近代OSの仮想メモリ機構の一部として実装されている、 ファイルをプロセスのアドレス空間に直接マッピングする仕組み。 通常のメモリアクセスとしてファイルにアクセスできる スワップファイルの機構も同じ仕組みで実装されている(ことが多い)。

33.

ファイルをメモリマッピングしたアドレスを NativeArrayとして返すNativeContainerを作った

34.

こんな感じでジョブ化したSHA-256を呼ぶ (ジョブの中では普通のNativeArrayとしてアクセスできる!)

36.

ジョブは入力がファイルであることを意識せずに実装できるし、 並列処理もしやすいので 意外と便利かも… 例: 独自形式のファイルからメッシュを生成するなど ※ここまでの話はすべてのプラットフォームで対応可能な方法ではありません

37.

おまけ

38.

SHA-256と言えば…

39.

とある クラウドソーシングサイト にて

43.

ここに注目 入力は任意のものではなく、限定されている 32バイト 8bit = 2^256通り

44.

Burstを使えば1GBを10秒ほど でハッシュ計算できるので…

45.

2 256 × 32 230 × 10

46.

256 2 × 32 × 10 230 70 = 3.4508732 × 10 (秒)

47.

256 2 × 32 × 10 230 70 = 3.4508732 × 10 63 = 1.0942647 × 10 (秒) (年)

48.

1,094那由多年かかる

49.

無理

50.

以上

51.

ご清聴 ありがとうございました