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

Late Data Layout - OOPLSA Talk

Late Data Layout - OOPLSA Talk

Late Data Layout talk at the OOPLSA research conference (Object-Oriented Programming, Systems, Languages & Applications). Website: http://2014.splashcon.org/event/oopsla2014-unifying-data-representation-transformations

Project website: http://scala-ldl.org

Vlad Ureche

October 23, 2014
Tweet

More Decks by Vlad Ureche

Other Decks in Programming

Transcript

  1. scala-ldl.org
    Late Data Layout:
    Unifying Data Representation Transformations
    Vlad Ureche Eugene Burmako Martin Odersky
    École polytechnique fédérale de Lausanne, Switzerland
    {first.last}@epfl.ch
    23rd of October 2014
    OOPSLA '14
    Portland, OR

    View Slide

  2. scala-ldl.org
    Late Data Layout:
    Unifying Data Representation Transformations

    View Slide

  3. scala-ldl.org
    Late Data Layout:
    Unifying Data Representation Transformations

    compiler transformations

    separate compilation

    global scope

    View Slide

  4. scala-ldl.org
    Late Data Layout:
    Unifying Data Representation Transformations

    unboxing, value classes

    how data is represented

    View Slide

  5. scala-ldl.org
    Late Data Layout:
    Unifying Data Representation Transformations

    what is there to unify?

    why bother?

    View Slide

  6. scala-ldl.org
    Motivation
    Transformation
    Conclusion
    Properties
    Benchmarks

    View Slide

  7. scala-ldl.org
    Representation Transformations

    View Slide

  8. scala-ldl.org
    Unboxing Primitive Types
    Representation Transformations

    View Slide

  9. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    View Slide

  10. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types
    int

    value

    no garbage collection

    locality

    View Slide

  11. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality

    View Slide

  12. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    in Java, programmers are
    responsible for the choice
    of representation
    int

    value

    no garbage collection

    locality

    View Slide

  13. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    in Java, programmers are
    responsible for the choice
    of representation What about Scala?
    int

    value

    no garbage collection

    locality

    View Slide

  14. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality

    View Slide

  15. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality

    View Slide

  16. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality
    scala.Int

    View Slide

  17. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality
    scalac
    scala.Int

    View Slide

  18. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality
    scalac
    Choice of representation
    1
    scala.Int

    View Slide

  19. scala-ldl.org
    Unboxing Primitive Types
    Unboxing Primitive Types

    indirect access

    object allocation

    and thus garbage collection

    no locality guarantees

    compatible with erased generics
    java.lang.Integer
    int

    value

    no garbage collection

    locality
    scalac
    Choice of representation
    1
    2 Coercions between representations
    scala.Int

    View Slide

  20. scala-ldl.org
    Unboxing Primitive Types
    Value Classes
    Representation Transformations

    View Slide

  21. scala-ldl.org
    Value Classes
    Value Classes

    View Slide

  22. scala-ldl.org
    Value Classes
    Value Classes
    value class

    View Slide

  23. scala-ldl.org
    Value Classes
    Value Classes
    value class
    struct (by-val)

    preferred encoding

    fields are inlined

    no heap allocations

    View Slide

  24. scala-ldl.org
    Value Classes
    Value Classes
    value class
    struct (by-val)

    preferred encoding

    fields are inlined

    no heap allocations

    fallback encoding

    compatible with

    subtyping

    erased generics
    object (by-ref)

    View Slide

  25. scala-ldl.org
    Value Classes
    Value Classes
    value class
    struct (by-val)

    preferred encoding

    fields are inlined

    no heap allocations

    fallback encoding

    compatible with

    subtyping

    erased generics
    object (by-ref)
    scalac
    Choice of representation
    1
    2 Coercions between representations

    View Slide

  26. scala-ldl.org
    Unboxing Primitive Types
    Value Classes
    Miniboxing
    Representation Transformations

    View Slide

  27. scala-ldl.org
    Miniboxing
    Miniboxing
    OOPSLA '13

    View Slide

  28. scala-ldl.org
    Miniboxing
    Miniboxing
    T (primitive)

    View Slide

  29. scala-ldl.org
    Miniboxing
    Miniboxing
    long integer

    preferred encoding

    for all primitive types
    T (primitive)

    View Slide

  30. scala-ldl.org
    Miniboxing
    Miniboxing
    long integer

    preferred encoding

    for all primitive types

    fallback encoding

    compatible with

    virtual dispatch

    subtyping

    erased generics
    T (erased to Object)
    T (primitive)

    View Slide

  31. scala-ldl.org
    Miniboxing
    Miniboxing
    long integer

    preferred encoding

    for all primitive types

    fallback encoding

    compatible with

    virtual dispatch

    subtyping

    erased generics
    T (erased to Object)
    T (primitive)
    scalac
    Choice of representation
    1
    2 Coercions between representations

    View Slide

  32. scala-ldl.org
    Unboxing Primitive Types
    Value Classes
    Representation Transformations
    Miniboxing

    View Slide

  33. scala-ldl.org
    Unboxing Primitive Types
    Value Classes
    Representation Transformations
    Miniboxing
    motivated by
    erased generics

    View Slide

  34. scala-ldl.org
    Unboxing Primitive Types
    Value Classes
    Representation Transformations
    Miniboxing
    motivated by
    erased generics
    Staging (Multi-Stage Programming)

    View Slide

  35. scala-ldl.org
    Staging
    Staging
    Program
    Result
    1+1+3
    5
    1-stage execution

    View Slide

  36. scala-ldl.org
    Staging
    Staging
    Program
    Result
    1+1+3
    5
    1-stage execution
    Program
    Program
    Result
    2+3
    1+1+3
    5
    2-stage execution

    View Slide

  37. scala-ldl.org
    Staging
    Staging
    value

    View Slide

  38. scala-ldl.org
    Staging
    Staging
    value
    direct value (5)

    is a computed value

    from an expression
    evaluated in the
    current stage

    View Slide

  39. scala-ldl.org
    Staging
    Staging
    value
    direct value (5)

    is a computed value

    from an expression
    evaluated in the
    current stage

    executed in the next stage

    stores the expression that
    produces the value
    lifted expression (2+3)

    View Slide

  40. scala-ldl.org
    scalac
    Staging
    Staging
    value
    direct value (5)

    is a computed value

    from an expression
    evaluated in the
    current stage

    executed in the next stage

    stores the expression that
    produces the value
    lifted expression (2+3)
    Choice of representation – domain-specific
    1
    2 Coercions between representations

    View Slide

  41. scala-ldl.org
    Motivation
    Transformation
    Conclusion
    Properties
    Benchmarks

    View Slide

  42. scala-ldl.org
    How to transform a program?

    View Slide

  43. scala-ldl.org
    How to transform a program?
    We'll use primitive unboxing
    as the running example,
    to keep things simple

    View Slide

  44. scala-ldl.org
    Syntax-based transformation
    Late Data Layout transformation

    View Slide

  45. scala-ldl.org
    Syntax-based transformation
    Late Data Layout transformation

    View Slide

  46. scala-ldl.org
    Syntax-based
    Syntax-based

    we need coercions between representations

    simple set of syntax-based rules
    – example

    View Slide

  47. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x

    View Slide

  48. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x

    View Slide

  49. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)

    View Slide

  50. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)
    Coerce the definition
    right-hand side

    View Slide

  51. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)
    Coerce all occurences of
    the transformed value

    View Slide

  52. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)

    View Slide

  53. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)
    val x: int = unbox(...)
    val y: int = unbox(box(x))

    View Slide

  54. scala-ldl.org
    Syntax-based
    Syntax-based
    val x: Int = ...
    val y: Int = x
    val x: int = unbox(...)
    val y: Int = box(x)
    val x: int = unbox(...)
    val y: int = unbox(box(x))
    suboptimal

    View Slide

  55. scala-ldl.org
    Peephole Optimization
    Peephole Optimization
    val y: int = unbox(box(x))
    val y: int = x
    peephole

    View Slide

  56. scala-ldl.org
    Syntax-based
    Syntax-based
    another example

    View Slide

  57. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: Int, t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2

    View Slide

  58. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: Int, t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    Transform one by one

    View Slide

  59. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: Int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    t2

    View Slide

  60. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)

    View Slide

  61. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    Anything missing?

    View Slide

  62. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    Anything missing?
    Yes, unboxing the returned value

    View Slide

  63. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)

    View Slide

  64. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): Int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)

    View Slide

  65. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)

    View Slide

  66. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    unbox(
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    )

    View Slide

  67. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    unbox(
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    )

    View Slide

  68. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    unbox(
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    )

    View Slide

  69. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    unbox(
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    ) new peephole rule

    View Slide

  70. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    unbox(
    if (Random.nextBoolean())
    box(t1)
    else
    box(t2)
    ) new peephole rule
    sink outside coercions
    into the if branches

    View Slide

  71. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    unbox(box(t1))
    else
    unbox(box(t2))

    View Slide

  72. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    unbox(box(t1))
    else
    unbox(box(t2))

    View Slide

  73. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    t1
    else
    t2

    View Slide

  74. scala-ldl.org
    Syntax-based
    Syntax-based
    def choice(t1: int, t2: int): int =
    if (Random.nextBoolean())
    t1
    else
    t2
    complicated

    View Slide

  75. scala-ldl.org
    Syntax-based
    Syntax-based

    peephole transformation does not scale
    – needs multiple rewrite rules for each node
    – needs stateful rewrite rules
    – leads to an explosion of rules x states
    Details in
    the paper

    View Slide

  76. scala-ldl.org
    Coercions are fixed in the tree

    View Slide

  77. scala-ldl.org
    Coercions are fixed in the tree
    and moving them around is difficult.

    View Slide

  78. scala-ldl.org
    Coercions are fixed in the tree
    and moving them around is difficult.
    We need a more fluid abstraction.

    View Slide

  79. scala-ldl.org
    Coercions are fixed in the tree
    and moving them around is difficult.
    We need a more fluid abstraction.
    Types

    View Slide

  80. scala-ldl.org
    Syntax-based transformation
    Late Data Layout transformation

    View Slide

  81. scala-ldl.org
    Inject
    Coerce
    Commit
    Phases
    Late Data Layout transformation

    View Slide

  82. scala-ldl.org
    LDL Transformation
    LDL Transformation

    propagates representation information
    – into the type system

    based on annotated types

    e.g. an @unboxed annotation added to integers
    The Inject Phase
    The Inject Phase

    View Slide

  83. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: Int,
    t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  84. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  85. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    depending on the transformation, other
    operations can be performed as well
    (e.g. miniboxing duplicates methods)

    View Slide

  86. scala-ldl.org
    Inject
    Coerce
    Commit
    Phases
    Late Data Layout transformation

    View Slide

  87. scala-ldl.org
    LDL Transformation
    LDL Transformation

    introduces coercions
    – re-type-checks the tree
    – exposes representation mismatches

    as annotation mismatches (Int vs @unboxed Int)

    leading to coercions
    The Coerce Phase
    The Coerce Phase

    View Slide

  88. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  89. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  90. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    the return type of choice
    is @unboxed Int

    View Slide

  91. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    the return type of choice
    is @unboxed Int

    View Slide

  92. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int
    the return type of choice
    is @unboxed Int

    View Slide

  93. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int
    expected type
    (part of local type inference)
    the return type of choice
    is @unboxed Int

    View Slide

  94. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int

    View Slide

  95. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : Boolean

    View Slide

  96. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : Boolean
    matches:
    expected: Boolean
    found: Boolean

    View Slide

  97. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int

    View Slide

  98. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int
    matches:
    expected: @unboxed Int
    found: @unboxed Int

    View Slide

  99. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int

    View Slide

  100. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    matches:
    ...
    : @unboxed Int

    View Slide

  101. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  102. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    LDL optimally transforms
    the tree the first time

    View Slide

  103. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    LDL optimally transforms
    the tree the first time
    No peephole transformation

    View Slide

  104. scala-ldl.org
    Inject
    Coerce
    Commit
    Phases
    Late Data Layout transformation

    View Slide

  105. scala-ldl.org
    LDL Transformation
    LDL Transformation

    converts annotations to representations
    – @unboxed Int → int
    – Int java.lang.Integer


    coercion markers are also transformed
    – box(...) → new Integer(...)
    – unbox(...) → ....intValue
    The Commit Phase
    The Commit Phase

    View Slide

  106. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: @unboxed Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  107. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: int,
    t2: int): int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  108. scala-ldl.org
    LDL Transformation
    LDL Transformation
    def choice(t1: int,
    t2: int): int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    that's it!

    View Slide

  109. scala-ldl.org
    Inject
    Coerce
    Commit
    Phases
    Late Data Layout transformation

    View Slide

  110. scala-ldl.org
    Motivation
    Transformation
    Conclusion
    Properties
    Benchmarks

    View Slide

  111. scala-ldl.org
    Selectivity
    Consistency
    Optimality (not formally proven yet)
    Properties
    Late Data Layout transformation

    View Slide

  112. scala-ldl.org
    Selectivity
    Selectivity inject
    coerce
    commit

    annotated types
    – selectively pick the representation for each value

    View Slide

  113. scala-ldl.org
    Selectivity
    Selectivity inject
    coerce
    commit

    annotated types
    – selectively pick the representation for each value

    selectivity is used for
    – bridge methods (some args boxed, others unboxed)
    – value classes (JVM: no multi-value returns)
    – staging (representation: domain-specific knowledge)

    List[Int] vs List[@staged Int] vs @staged List[Int]

    View Slide

  114. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit

    View Slide

  115. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: Int): Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    what if we did not annotate t1?

    View Slide

  116. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    what if we did not annotate t1?

    View Slide

  117. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int

    View Slide

  118. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int

    View Slide

  119. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int
    mismatch:
    expected: @unboxed Int
    found: Int

    View Slide

  120. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    t1
    else
    t2
    inject
    coerce
    commit
    : @unboxed Int
    mismatch:
    expected: @unboxed Int
    found: Int
    coercion

    View Slide

  121. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    unbox(t1)
    else
    t2
    inject
    coerce
    commit

    View Slide

  122. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: Int,
    t2: @unboxed Int): @unboxed Int =
    if (Random.nextBoolean())
    unbox(t1)
    else
    t2
    inject
    coerce
    commit

    View Slide

  123. scala-ldl.org
    Selectivity
    Selectivity
    def choice(t1: java.lang.Integer,
    t2: int): int =
    if (Random.nextBoolean())
    t1.intValue
    else
    t2
    inject
    coerce
    commit

    View Slide

  124. scala-ldl.org
    Selectivity
    Consistency
    Optimality (not formally proven yet)
    Properties
    Late Data Layout transformation

    View Slide

  125. scala-ldl.org
    Consistency
    Consistency inject
    coerce
    commit

    representations become part of types

    re-type-checking the program
    – proves type correctness
    – proves representation consistency

    View Slide

  126. scala-ldl.org
    Selectivity
    Consistency
    Optimality (not formally proven yet)
    Properties
    Late Data Layout transformation

    View Slide

  127. scala-ldl.org
    Optimality
    Optimality
    def choice(t1: java.lang.Integer,
    t2: int): int =
    if (Random.nextBoolean())
    t1.intValue
    else
    t2
    inject
    coerce
    commit

    View Slide

  128. scala-ldl.org
    Optimality
    Optimality
    def choice(t1: java.lang.Integer,
    t2: int): int =
    if (Random.nextBoolean())
    t1.intValue
    else
    t2
    execution
    inject
    coerce
    commit

    View Slide

  129. scala-ldl.org
    Optimality
    Optimality
    def choice(t1: java.lang.Integer,
    t2: int): int =
    if (Random.nextBoolean())
    t1.intValue
    else
    t2
    1 coercion
    execution
    inject
    coerce
    commit

    View Slide

  130. scala-ldl.org
    Optimality
    Optimality
    def choice(t1: java.lang.Integer,
    t2: int): int =
    if (Random.nextBoolean())
    t1.intValue
    else
    t2
    1 coercion
    no coercions
    execution
    inject
    coerce
    commit

    View Slide

  131. scala-ldl.org
    Optimality
    Optimality

    on any execution trace through the program
    – the number of coercions executed is minimum
    – assuming the program terminates
    inject
    coerce
    commit

    View Slide

  132. scala-ldl.org
    Optimality
    Optimality

    on any execution trace through the program
    – the number of coercions executed is minimum
    – assuming the program terminates

    modulo
    – annotations introduced by the inject phase

    unbox both parameters → no coercions at all
    inject
    coerce
    commit

    View Slide

  133. scala-ldl.org
    Optimality
    Optimality

    on any execution trace through the program
    – the number of coercions executed is minimum
    – assuming the program terminates

    modulo
    – annotations introduced by the inject phase

    unbox both parameters → no coercions at all
    – post-transformations done by the commit phase

    box(...) → new Integer(new Integer(...).intValue)
    inject
    coerce
    commit

    View Slide

  134. scala-ldl.org
    Optimality
    Optimality

    peephole optimization
    – propagates coercions

    type system
    – propagates types
    inject
    coerce
    commit

    View Slide

  135. scala-ldl.org
    Optimality
    Optimality

    peephole optimization
    – propagates coercions

    type system
    – propagates types
    – but types are fluid whereas coercions are not
    details in the paper
    inject
    coerce
    commit

    View Slide

  136. scala-ldl.org
    Selectivity
    Consistency
    Optimality (not formally proven yet)
    Properties
    Late Data Layout transformation

    View Slide

  137. scala-ldl.org
    Motivation
    Transformation
    Conclusion
    Properties
    Benchmarks

    View Slide

  138. scala-ldl.org
    LDL is used in
    LDL is used in

    Scala compiler plugins
    – miniboxing (specialization)
    – value-class plugin
    – staging plugin

    View Slide

  139. scala-ldl.org
    Benchmarks
    Benchmarks

    … in the paper
    in the paper

    implementation effort
    – Late Data Layout mechanism

    developed as part of miniboxing

    reused by the other compiler plugins
    – value class plugin → 2 developer-weeks
    – staging plugin → 1 developer-week

    View Slide

  140. scala-ldl.org
    Benchmarks
    Benchmarks

    … in the paper
    in the paper

    performance
    – baseline vs transformed code

    numbers
    – up to 2x speedup when transforming value classes
    – up to 22x speedup when using miniboxing
    – up to 59x speedup when staging

    View Slide

  141. scala-ldl.org
    Motivation
    Transformation
    Conclusion
    Properties
    Benchmarks

    View Slide

  142. scala-ldl.org
    Conclusion
    Conclusion
    Insights
    Insights

    use annotated types
    – to selectively mark values with the representation

    use expected type propagation
    – to provide optimal transformation

    use the type system
    – to provide representation consistency

    View Slide

  143. scala-ldl.org
    Credits and Thank you-s

    Cristian Talau - developed the initial prototype, as a semester project

    Eugene Burmako - the value class plugin based on the LDL transformation

    Aymeric Genet - developing collection-like benchmarks for the miniboxing plugin

    Martin Odersky, for his patient guidance

    Eugene Burmako, for trusting the idea enough to develop the value-plugin based on the LDL transformation

    Iulian Dragos, for his work on specialization and many explanations

    Miguel Garcia, for his original insights that spawned the miniboxing idea

    Michel Schinz, for his wonderful comments and enlightening ACC course

    Andrew Myers and Roland Ducournau for the discussions we had and the feedback provided

    Heather Miller for the eye-opening discussions we had

    Vojin Jovanovic, Sandro Stucki, Manohar Jonalagedda and the whole LAMP laboratory in EPFL for the extraordinary atmosphere

    Adriaan Moors, for the miniboxing name which stuck :))

    Thierry Coppey, Vera Salvisberg and George Nithin, who patiently listened to many presentations and provided valuable feedback

    Grzegorz Kossakowski, for the many brainstorming sessions on specialization

    Erik Osheim, Tom Switzer and Rex Kerr for their guidance on the Scala community side

    OOPSLA paper and artifact reviewers, who reshaped the paper with their feedback

    Sandro, Vojin, Nada, Heather, Manohar - reviews and discussions on the LDL paper

    Hubert Plociniczak for the type notation in the LDL paper

    Denys Shabalin, Dmitry Petrashko for their patient reviews of the LDL paper

    Xiaoya Xiang and Philip Stutz for trusting miniboxing enough to try it out
    Special thanks to the Scala Community for their support!
    (@StuHood, @vpatryshev and everyone else!)

    View Slide

  144. scala-ldl.org
    concept
    repr. 1 … repr. n
    repr. 2

    View Slide

  145. scala-ldl.org
    concept
    repr. 1 … repr. n
    repr. 2
    How would
    you use this?

    View Slide

  146. scala-ldl.org
    Thank you!
    concept
    repr. 1 … repr. n
    repr. 2
    How would
    you use this?

    View Slide