Pro Yearly is on sale from $80 to $50! »

Look into Project Valhalla from CLR viewpoint

Look into Project Valhalla from CLR viewpoint

Similar points and different points are listed with comparing Project Valhalla to CLR's value type.

C732029414e4c194b34639341e5eb199?s=128

Akihiro Nishikawa

November 23, 2019
Tweet

Transcript

  1. #ccc_c4 CLRのValue Typeを起点にProject Valhallaを覗いてみる Look into Project Valhalla from CLR

    viewpoint
  2. https://speakerdeck.com/logico/look-into- project-Valhalla-from-clr-viewpoint

  3. このセッションで持ち帰ってもらいたいこと

  4. Who am I? https://logico-jp.io

  5. Agenda

  6. メモリレイアウトの重要性

  7. CPUはデータの局所性 (Data Locality) の原則に従う

  8. CPUからのメモリアクセス L1 L2 Main Memory L3 Cache

  9. レイテンシ Intel Broadwell-EPを例に L1 L2 Main Memory Intel® 64 and

    IA-32 Architectures Optimization Reference Manual https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf L3 Cache
  10. CLRのValue Type

  11. CLR (Common Language Runtime) https://docs.microsoft.com/ja-jp/dotnet/standard/clr

  12. CLRの型の種類

  13. Value Type (値型)  enum  struct https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/value-types

  14. Nullable Value Type (Null許容値型) https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/nullable-types/

  15. None
  16. static void Main() { Point a = new Point(2, 4);

    Point b = a; Point c = a; ... } struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } ... }
  17. static void Main() { Point a = new Point(2, 4);

    Point b = a; Point c = a; ... } struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } ... } Stack Heap a = Point(2,4) b = Point(2,4) c = Point(2,4)
  18. Reference Type (参照型)  class  配列 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/reference-types

  19. O M Method table pointer Object header AbcD..

  20. Nullable Reference Type (Null許容参照型) https://docs.microsoft.com/ja-jp/dotnet/csharp/nullable-references

  21. static void Main() { Point a = new Point(2, 4);

    Point b = a; Point c = a; ... } class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } }
  22. static void Main() { Point a = new Point(2, 4);

    Point b = a; Point c = a; ... } class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } Stack Heap a(ref) b(ref) c(ref) a Point(2,4)
  23. 3 12 24 O M 53 値型の配列 O M -1

    9 1 -1 -8 2 5 8 5 2 3
  24. O M 5 参照型の配列

  25. O M 5 O M 3 2 O M -1

    9 O M -8 2 O M 1 -1 O M 5 8
  26. 値型のメリット

  27. 値型のデメリット

  28. Project Valhallaとは

  29. Project Valhalla ― Reboot JVM relationship with data in memory

    https://wiki.openjdk.java.net/display/valhalla/Main
  30. スコープ

  31. スコープ

  32. マイルストン

  33. マイルストン  L2 (LW2) https://wiki.openjdk.java.net/display/valhalla/LW2

  34. LW2 http://jdk.java.net/valhalla/

  35. 様々な最適化

  36. Project Valhalla のこれまでのあゆみ JVMとプログラミングモデルの両方から調査 L World Early prototypes (M1-M3) コンパイラのみ

    調査対象は言語側 • Genericsの特殊化や ワイルドカード • VMへの要件 • 多数の検討課題があること を確認 “MVT” prototype VMのみ 調査対象は“Q-World”モデル 詳細はJVM Language Summit 2018の動画を 参照 Current prototype • VMとコンパイラをサポート • Genericsの特殊化、 参照型から値型への移行は 未サポート • まだまだ調査中
  37. * type

  38. Q World Q qload...

  39. Q World Q qload... 動きはしたが、 オーバーヘッドが大きく 使い物にならず...

  40. L World a*

  41. L World

  42. メモリレイアウトの効率化が必要な理由 (再掲) Intel Broadwell-EPを例に L1 L2 Main Memory Intel® 64

    and IA-32 Architectures Optimization Reference Manual https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf L3 Cache
  43. Javaでは?

  44. Object Identity フラットなメモリレイアウトを実現する上での課題 class Point { int x; int y;

    Point(int _x, int _y) { this.x = _x; this.y = _y; } } ... Point p1 = Point(1,2); Point p2 = Point(1,2);
  45. Object Identity フラットなメモリレイアウトを実現する上での課題 class Point { int x; int y;

    Point(int _x, int _y) { this.x = _x; this.y = _y; } } ... Point p1 = Point(1,2); Point p2 = Point(1,2); p1とp2は完全に 一致するか?
  46. M K 53 klass (同一クラスを使うインスタンス共通のmetadataへのPointer) mark (インスタンス固有のmetadata) Metaspace HotSpotの場合

  47. M K 3 12 24 53 配列

  48. M K 3 12 24 M K 3 M K

    12 M K 24 M K 53 53
  49. 例 public class Point { int x; int y; }

    public class App { ... Point[] points = new Point[5]; points[0] = new Point(); ... }
  50. M K 5

  51. M K 5 M K 3 2 M K -1

    9 M K -8 2 M K 1 -1 M K 5 8
  52. M K 3 2 M K -1 9 M K

    -8 2 M K 1 -1 M K 5 8 M K -1 9 1 -1 -8 2 5 8 5 2 3
  53. M K 3 2 M K -1 9 M K

    -8 2 M K 1 -1 M K 5 8 inline class M K -1 9 1 -1 -8 2 5 8 5 2 3
  54. 現在のプロトタイプでできること

  55. Inline class public inline class Point { private int x;

    private int y; private Point(int _x, int _y) { this.x = _x; this.y = _y; } public static Point of(int _x, int _y) { return new Point(_x,_y); } }
  56. コンストラクタ  defaultvalue  withfield

  57. public class Point { private int x; private int y;

    private Point(int _x, int _y) { this.x = _x; this.y = _y; } public static Point of(int _x, int _y) { return new Point(_x,_y); } } public inline class Point { private int x; private int y; private Point(int _x, int _y) { this.x = _x; this.y = _y; } public static Point of(int _x, int _y) { return new Point(_x,_y); } }
  58. 配列

  59. デフォルト値 Foo.default と表記 x = T.default x = null

  60. メモリレイアウトのフラット化 常にフラットでなければならないか?

  61. メモリレイアウトのフラット化 LW2 では V? を使う (Null許容) http://hg.openjdk.java.net/valhalla/valhalla /file/a32457198d3e/test/jdk/valhalla/valuet ypes/NonFlattenValue.java public

    inline class NonFlattenValue { Point? nfp; NonFlattenValue() { this.nfp = Point.makePoint(0,0); } NonFlattenValue(Point p) { this.nfp = p; } public Point? point() { return nfp; } public Point pointValue() { return (Point) nfp; } ... }
  62. Generics OptionalInt?

  63. 今後検討していくもの (LW2 では未検討のもの)

  64. 新しい上位型 – RefObject と ValObject

  65. 新しい上位型 – なぜ必要か? x instance of RefObject RefObject RefObject o

    extents RefObject
  66. Nullの許容

  67. Nullの許容 (L3での調査の中心部分)

  68. 同一性 (==)

  69. 同一性 (==)

  70. 移行 https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/doc- files/ValueBased.html https://docs.oracle.com/javase/jp/13/docs/api/java.base/java/lang/doc-files/ValueBased.html

  71. その他のIdentityに関連する操作

  72. Conclusion

  73. LW2時点でのInline Classの制限 基底クラス java.lang.Object 含められるもの Top level クラス、innerクラス、nestedクラス、localクラス 含められないもの Interface、annotation

    type、enum 宣言できるもの innerクラス、nestedクラス、localクラス Nullを許容するか しない 必ずデフォルト値を持つ (全ビットゼロ) abstractにできるか できない Inline Classは暗黙のうちにfinal Inline Classのメンバ 全てのインスタンスフィールドは暗黙のうちにfinal 明示的にregular interfaceを実装できる 再帰的に自インスタンスのフィールドの型として宣言できない javacによる操作 hashCode()、equals()、toString()を自動生成する clone()、finalize()、wait()、notify()を許可しない
  74. 現在検討しているもの (一例)

  75. まとめ

  76. セッションアンケート https://aka.ms/AA6m7dq

  77. Microsoft Learnや 開発者ニュースレター の詳細情報 https://aka.ms/AA6lx6o

  78. Resources

  79. Resources https://youtu.be/1H4vmT-Va4o https://youtu.be/_26KZAegYRM https://youtu.be/49GUljUmGHg https://www.slideshare.net/DavidBuck7/valhalla-update-jjug-ccc-spring-2019

  80. None