Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Akihiro Nishikawa

November 23, 2019
Tweet

More Decks by Akihiro Nishikawa

Other Decks in Technology

Transcript

  1. レイテンシ 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
  2. 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; } ... }
  3. 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)
  4. 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; } }
  5. 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)
  6. O M 5 O M 3 2 O M -1

    9 O M -8 2 O M 1 -1 O M 5 8
  7. Project Valhalla ― Reboot JVM relationship with data in memory

    https://wiki.openjdk.java.net/display/valhalla/Main
  8. Project Valhalla のこれまでのあゆみ JVMとプログラミングモデルの両方から調査 L World Early prototypes (M1-M3) コンパイラのみ

    調査対象は言語側 • Genericsの特殊化や ワイルドカード • VMへの要件 • 多数の検討課題があること を確認 “MVT” prototype VMのみ 調査対象は“Q-World”モデル 詳細はJVM Language Summit 2018の動画を 参照 Current prototype • VMとコンパイラをサポート • Genericsの特殊化、 参照型から値型への移行は 未サポート • まだまだ調査中
  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. 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);
  11. 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は完全に 一致するか?
  12. M K 3 12 24 M K 3 M K

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

    public class App { ... Point[] points = new Point[5]; points[0] = new Point(); ... }
  14. M K 5 M K 3 2 M K -1

    9 M K -8 2 M K 1 -1 M K 5 8
  15. 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
  16. 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
  17. 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); } }
  18. 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); } }
  19. メモリレイアウトのフラット化 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; } ... }
  20. 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()を許可しない