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

Optimizing Ruby with TruffleRuby

Optimizing Ruby with TruffleRuby

Ruby User Group Linz

Benoit Daloze

March 15, 2017
Tweet

More Decks by Benoit Daloze

Other Decks in Programming

Transcript

  1. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Op?mizing  Ruby  with  
    TruffleRuby  
    The  Ruby  Logo  is  Copyright  (c)  2006,  Yukihiro  Matsumoto.  It  is  licensed  under  the  terms  of  the  Crea?ve  Commons  APribu?on-­‐ShareAlike  2.5  agreement.  
    Slides  from  Chris  Seaton  
    Oracle  Labs  @ChrisGSeaton  
     
    Benoit  Daloze  
    @eregontp  
     
    15  March  2017  
    Linz  Ruby  User  Group  

    View Slide

  2. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Safe  Harbor  Statement  
    The  following  is  intended  to  provide  some  insight  into  a  line  of  research  in  Oracle  Labs.  It  
    is  intended  for  informa?on  purposes  only,  and  may  not  be  incorporated  into  any  
    contract.    It  is  not  a  commitment  to  deliver  any  material,  code,  or  func?onality,  and  
    should  not  be  relied  upon  in  making  purchasing  decisions.  Oracle  reserves  the  right  to  
    alter  its  development  plans  and  prac?ces  at  any  ?me,  and  the  development,  release,  and  
    ?ming  of  any  features  or  func?onality  described  in  connec?on  with  any  Oracle  product  or  
    service  remains  at  the  sole  discre?on  of  Oracle.    Any  views  expressed  in  this  presenta?on  
    are  my  own  and  do  not  necessarily  reflect  the  views  of  Oracle.  
    2  

    View Slide

  3. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Who  am  I  ?  
    •  Benoit  Daloze  
    •  PhD  student  at  Johannes  Kepler  University  
    •  Research  with  TruffleRuby  on  concurrency  
    •  MRI  and  JRuby  commiPer  
    •  Maintainer  of  the  Ruby  Spec  Suite  (ruby/spec)  
    3  
    TwiPer:  @eregontp  
    GitHub:  @eregon  

    View Slide

  4. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Agenda  
    •  Introduc?on  
    •  Truffle  and  Ruby  implementa?ons  
    •  Why  is  Ruby  apparently  so  hard  to  run  fast?  
    •  Par?al  Evalua?on  
    •  Performance  &  Compa?bility  
    4  

    View Slide

  5. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Computer  Language  Benchmarks  Game  

    View Slide

  6. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Goal:
    Computer  Language  Benchmarks  Game  

    View Slide

  7. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    What  is  Truffle?  

    View Slide

  8. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    How  do  Ruby  interpreters  work?  

    View Slide

  9. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    x  +  y  *  z  

    View Slide

  10. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    x  +  y  *  z  
    +  
    x   *  
    y   z  

    View Slide

  11. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    x  +  y  *  z  
    +  
    x   *  
    y   z  
    load_local  x  
    load_local  y  
    load_local  z  
    call  :*  
    call  :+  

    View Slide

  12. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Just-­‐In-­‐Time  Compilers  

    View Slide

  13. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    x  +  y  *  z  
    +  
    x   *  
    y   z  
    load_local  x  
    load_local  y  
    load_local  z  
    call  :*  
    call  :+  

    View Slide

  14. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    x  +  y  *  z  
    +  
    x   *  
    y   z  
    load_local  x  
    load_local  y  
    load_local  z  
    call  :*  
    call  :+  
    pushq  %rbp  
    movq    %rsp,  %rbp  
    movq    %rdi,  -­‐8(%rbp)  
    movq    %rsi,  -­‐16(%rbp)  
    movq    %rdx,  -­‐24(%rbp)  
    movq    -­‐16(%rbp),  %rax  
    movl    %eax,  %edx  
    movq    -­‐24(%rbp),  %rax  
    imull  %edx,  %eax  
    movq    -­‐8(%rbp),  %rdx  
    addl    %edx,  %eax  
    popq    %rbp  
    ret  

    View Slide

  15. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    The  JRuby  logo  is  copyright  (c)  Tony  Price  2011,  licensed  under  the  terms  of  Crea?ve  Commons  APribu?on-­‐NoDerivs  3.0  Unported  (CC  BY-­‐ND  3.0)  
    JRuby  
    JITs  by  emihng  JVM  bytecode  
    VM  in  Java  
    Core  library  mostly  in  Java  

    View Slide

  16. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    The  Rubinius  logo  is  copyright  2011  Shane  Becker,  licensed  under  the  terms  of  Crea?ve  Commons  APribu?on-­‐NoDeriva?ves  4.0  Interna?onal  —  CC  BY-­‐ND  4.0  
    Rubinius  
    JITs  by  emihng  LLVM  bitcode  
    VM  in  C++  
    Core  library  mostly  in  Ruby  

    View Slide

  17. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    The  Rubinius  logo  is  copyright  2011  Shane  Becker,  licensed  under  the  terms  of  Crea?ve  Commons  APribu?on-­‐NoDeriva?ves  4.0  Interna?onal  —  CC  BY-­‐ND  4.0  
    Rubinius  
    JITs  by  emihng  LLVM  bitcode  
    VM  in  C++  
    Core  library  mostly  in  Ruby  

    View Slide

  18. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    18  

    View Slide

  19. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    19  

    View Slide

  20. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    JIT  
    20  

    View Slide

  21. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    JIT  
    21  

    View Slide

  22. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    Graal  
    22  

    View Slide

  23. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    JVM  
    Graal  
    Truffle  
    23  

    View Slide

  24. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Truffle  
    Graal  VM  
    JVM  
    24  

    View Slide

  25. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    U
    U U
    U
    U I
    I I
    G
    G I
    I I
    G
    G
    Node Rewriting
    for Profiling Feedback
    AST Interpreter
    Rewritten Nodes
    AST Interpreter
    Uninitialized Nodes
    Compilation using
    Partial Evaluation
    Compiled Code
    Node Transitions
    S
    U
    I
    D
    G
    Uninitialized Integer
    Generic
    Double
    String
    T.  Würthinger,  C.  Wimmer,  A.  Wöß,  L.  Stadler,  G.  Duboscq,  C.  Humer,  G.  Richards,  D.  Simon,  
    and  M.  Wolczko.  One  VM  to  rule  them  all.  In  Proceedings  of  Onward!,  2013.  
    Compiling  the  AST  to  machine  code  

    View Slide

  26. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    T.  Würthinger,  C.  Wimmer,  A.  Wöß,  L.  Stadler,  G.  Duboscq,  C.  Humer,  G.  Richards,  D.  Simon,  
    and  M.  Wolczko.  One  VM  to  rule  them  all.  In  Proceedings  of  Onward!,  2013.  
    I
    I I
    G
    G I
    I I
    G
    G
    Deoptimization
    to AST Interpreter
    D
    I D
    G
    G D
    I D
    G
    G
    Node Rewriting to Update
    Profiling Feedback
    Recompilation using
    Partial Evaluation
    Deop?miza?on  and  recompila?on  

    View Slide

  27. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   27  

    View Slide

  28. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   28  

    View Slide

  29. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   29  

    View Slide

  30. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   30  

    View Slide

  31. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Why  is  Ruby  apparently  so  hard  
    to  run  fast?  

    View Slide

  32. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   32  

    View Slide

  33. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   33  

    View Slide

  34. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  35. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   35  

    View Slide

  36. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   36  

    View Slide

  37. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    require  'benchmark/ips'  
       
    Benchmark.ips  do  |x|  
       x.report(  "direct",            "14  +  2"                    )  
       x.report(  "send-­‐symbol",  "14.send(:+,  2)"    )  
       x.report(  "send-­‐string",  "14.send('+',  2)"  )  
       x.report(  "eval",                "eval('14  +  2')"    )  
       x.compare!  
    end  
       

    View Slide

  38. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
                               direct:  37299872.6  i/s  
                     send-­‐symbol:  13060179.1  i/s  -­‐  2.86x  slower  
                     send-­‐string:    4974575.3  i/s  -­‐  7.50x  slower  
                                   eval:      171835.9  i/s  -­‐  217.07x  slower  

    View Slide

  39. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Throwing  away  metaprogramming  
    •  Crystal  –  throws  away  metaprogramming  en?rely  to  make  a  faster  Ruby  
    •  Rubinius  –  doesn’t  support  set_trace_func  
    •  JRuby  –  doesn’t  support  set_trace_func  or  ObjectSpace  
    •  RubyMo?on  –  doesn’t  support  eval,  Binding  

    View Slide

  40. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    How  does  Truffle  +  Graal  solve  this?  

    View Slide

  41. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    ParCal  EvaluaCon  
    And  DeopCmizaCon  

    View Slide

  42. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   42  
    def min(a, b)
    [a, b].sort[0]
    end
    puts min(2, 8)

    View Slide

  43. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   43  
    def min(a, b)
    [a, b].sort[0]
    end
    puts [2, 8].sort[0]

    View Slide

  44. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   44  
    t0 = 2 <=> 8
    t1 = t0 < 0 ? 2 : 8
    t2 = t0 > 0 ? 8 : 2
    t3 = [t1, t2]
    puts t3[0]

    View Slide

  45. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   45  
    t0 = 2 <=> 8
    t1 = t0 < 0 ? 2 : 8
    t2 = t0 > 0 ? 8 : 2
    t3 = [t1, t2]
    puts t1

    View Slide

  46. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   46  
    t0 = -1
    t1 = t0 < 0 ? 2 : 8
    puts t1

    View Slide

  47. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   47  
    t0 = -1
    t1 = -1 < 0 ? 2 : 8
    puts t1

    View Slide

  48. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   48  
    t1 = true ? 2 : 8
    puts t1

    View Slide

  49. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   49  
    t1 = 2
    puts t1

    View Slide

  50. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   50  
    t1 = 2
    puts 2

    View Slide

  51. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    require  'benchmark/ips'  
       
    Benchmark.ips  do  |x|  
       x.report(  "direct",            "14  +  2"                    )  
       x.report(  "send-­‐symbol",  "14.send(:+,  2)"    )  
       x.report(  "send-­‐string",  "14.send('+',  2)"  )  
       x.report(  "eval",                "eval('14  +  2')"    )  
       x.compare!  
    end  
       

    View Slide

  52. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
                               direct:  37299872.6  i/s  
                     send-­‐symbol:  13060179.1  i/s  -­‐  2.86x  slower  
                     send-­‐string:    4974575.3  i/s  -­‐  7.50x  slower  
                                   eval:      171835.9  i/s  -­‐  217.07x  slower  

    View Slide

  53. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
                               direct:  73099792.5  i/s    
                     send-­‐symbol:  73458837.7  i/s  –  difference  within  err  
                     send-­‐string:  66882023.8  i/s  -­‐  difference  within  err  
                                   eval:  67024838.3  i/s  -­‐  difference  within  err  

    View Slide

  54. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    An  extreme  example  

    View Slide

  55. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  56. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  57. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  58. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  59. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  60. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  61. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    =  22  !  

    View Slide

  62. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  63. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  64. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  65. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  66. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  67. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Performance  

    View Slide

  68. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Speedup  rela?ve  to  MRI  

    View Slide

  69. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  

    View Slide

  70. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  




    MRI 2.3
    JRuby 9.0.4
    Node.js
    JRuby+Truffle
    Java 1.8.0u66
    1
    5
    10
    25
    50
    75
    12  Benchmarks  using  Objects,  Closures  and  Arrays  
         from  hPps://github.com/smarr/are-­‐we-­‐fast-­‐yet    
               TruffleRuby  

    View Slide

  71. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   71  
    Optcarrot:  NES  emulator  benchmark  

    View Slide

  72. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Optcarrot:  NES  emulator  benchmark  –  9x  faster  than  MRI  
    72  

    View Slide

  73. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   73  
    Demo  Time  !  

    View Slide

  74. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    CompaCbility  

    View Slide

  75. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Language  specs  
    96%   Core  library  specs  
    100%  
    92%   C-­‐extension  API  specs  
    Ruby  specs  
    75  

    View Slide

  76. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    But  does  it  run  
    “Rails”,  “Ruby  on  Rails”,  and  the  Rails  logo  are  registered  trademarks  of  David  Heinemeier  Hansson  
    ?  

    View Slide

  77. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   77  

    View Slide

  78. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Rails  tests  
    Ac?ve  Model  
    Ac?ve  Support  
    Ac?ve  Record  
    Ac?on  View  
    Ac?on  Pack  
    Ac?on  Mailer  
    Rail?es  
    Sprockets-­‐Rails  
    Ac?ve  Job  
    Spring  
    100%  
    100%  
    98%  
    Basic  func0onality  works  
    37%  
    78  

    View Slide

  79. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    So  then  why  can’t  we  run  real  applica?ons  yet?  
    •  C  extensions  are  s?ll  a  work  in  progress  
    – Almost  no  database  drivers  
    – No  openssl  
    – No  nokogiri  
    – Prevents  us  running  almost  everything  unfortunately  
    •  The  specs  don’t  have  perfect  coverage  
    79  

    View Slide

  80. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Ongoing  Research  
    •  Running  C  extension  with  Sulong  (Truffle+LLVM)  
    •  ObjectSpace:  stop  the  world  and  walk  the  frames  
    •  Represen?ng  String  as  Ropes  
    •  Efficient  parallelism:  
    •  Thread-­‐Safe  Objects  for  Dynamic  Languages  
    •  Thread-­‐Safe  and  Scalable  Ruby  collec?ons  

    View Slide

  81. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Conclusions  
    Simple  VM  ideas  can  solve  the  major  problems  of  
    making  Ruby  fast  

    View Slide

  82. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Conclusions  
    Simple  VM  ideas  can  solve  the  major  problems  of  
    making  Ruby  fast  
     
    We  don’t  need  to  tell  Ruby  programmers  to  avoid  
    language  features  to  get  performance  

    View Slide

  83. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
    Where  to  get  more  info  

    View Slide

  84. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |  
     
     
    hPps://github.com/graalvm/truffleruby  
     
    (or  just  search  for  “truffleruby”)  

    View Slide

  85. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   85  
    Search  for  ’graal  otn’  
    www.oracle.com/technetwork/oracle-­‐labs/program-­‐languages  

    View Slide

  86. Copyright  ©  2016,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   86  
    Acknowledgements  
    Oracle  
    Danilo  Ansaloni  
    Stefan  Anzinger  
    Cosmin  Basca  
    Daniele  BonePa  
    MaPhias  Brantner  
    Petr  Chalupa  
    Jürgen  Christ  
    Laurent  Daynès  
    Gilles  Duboscq  
    Mar?n  Entlicher  
    Brandon  Fish  
    Bas?an  Hossbach  
    Chris?an  Humer  
    Mick  Jordan  
    Vojin  Jovanovic  
    Peter  Kessler  
    David  Leopoldseder  
    Duncan  MacGregor  
    Kevin  Menard  
    Jakub  Podlešák  
    Aleksandar  Prokopec  
    Tom  Rodriguez  
    Oracle  (con0nued)  
    Roland  Schatz  
    Chris  Seaton  
    Doug  Simon  
    Štěpán  Šindelář  
    Zbyněk  Šlajchrt  
    Lukas  Stadler  
    Codrut  Stancu  
    Jan  Štola  
    Jaroslav  Tulach  
    Michael  Van  De  Vanter  
    Adam  Welc  
    Chris?an  Wimmer  
    Chris?an  Wirth  
    Paul  Wögerer  
    Mario  Wolczko  
    Andreas  Wöß  
    Thomas  Würthinger  
    JKU  Linz  
    Prof.  Hanspeter  Mössenböck  
    Benoit  Daloze  
    Josef  Eisl  
    Thomas  Feich?nger  
    MaPhias  Grimmer  
    Chris?an  Häubl  
    Josef  Haider  
    Chris?an  Huber  
    Stefan  Marr  
    Manuel  Rigger  
    Stefan  Rumzucker  
    Bernhard  Urban  
     
    University  of  Edinburgh  
    Christophe  Dubach  
    Juan  José  Fumero  Alfonso  
    Ranjeet  Singh  
    Toomas  Remmelg  
     
    LaBRI  
    Floréal  Morandat  
    University  of  California,  Irvine  
    Prof.  Michael  Franz  
    Gulfem  Savrun  Yeniceri  
    Wei  Zhang  
     
    Purdue  University  
    Prof.  Jan  Vitek  
    Tomas  Kalibera  
    Petr  Maj  
    Lei  Zhao  
     
    T.  U.  Dortmund  
    Prof.  Peter  Marwedel  
    Helena  KoPhaus  
    Ingo  Korb  
     
    University  of  California,  Davis  
    Prof.  Duncan  Temple  Lang  
    Nicholas  Ulle  
     
    University  of  Lugano,  Switzerland  
    Prof.  Walter  Binder  
    Sun  Haiyang  
    Yudi  Zheng  
    Oracle  Interns  
    Brian  Belleville    
    Miguel  Garcia  
    Shams  Imam  
    Alexey  Karyakin  
    Stephen  Kell  
    Andreas  Kun…  
    Volker  Lan?ng  
    Gero  Leinemann  
    Julian  LePner  
    Joe  Nash  
    David  Piorkowski  
    Gregor  Richards  
    Robert  Seilbeck  
    Rifat  Shariyar  
     
    Alumni  
    Erik  Eckstein  
    Michael  Haupt  
    Christos  Kotselidis  
    Hyunjin  Lee  
    David  Leibs  
    Chris  Thalinger  
    Till  Westmann  

    View Slide