Author: Armin Rigo <[email protected]>
Branch: extradoc
Changeset: r4843:0730c6ebec3f
Date: 2012-10-08 17:55 +0200
http://bitbucket.org/pypy/extradoc/changeset/0730c6ebec3f/
Log: merge heads
diff --git a/talk/ep2012/jit/abstract.rst b/talk/pycon-uk-2012/abstract.rst
copy from talk/ep2012/jit/abstract.rst
copy to talk/pycon-uk-2012/abstract.rst
diff --git a/talk/ep2012/jit/talk/Makefile b/talk/pycon-uk-2012/talk/Makefile
copy from talk/ep2012/jit/talk/Makefile
copy to talk/pycon-uk-2012/talk/Makefile
diff --git a/talk/pycon-uk-2012/talk/author.latex
b/talk/pycon-uk-2012/talk/author.latex
new file mode 100644
--- /dev/null
+++ b/talk/pycon-uk-2012/talk/author.latex
@@ -0,0 +1,8 @@
+\definecolor{rrblitbackground}{rgb}{0.0, 0.0, 0.0}
+
+\title[PyPy JIT under the hood]{PyPy JIT under the hood}
+\author[antocuni]
+{Antonio Cuni}
+
+\institute{PyCon UK 2012}
+\date{September 28, 2012}
diff --git a/talk/ep2012/jit/talk/beamerdefs.txt
b/talk/pycon-uk-2012/talk/beamerdefs.txt
copy from talk/ep2012/jit/talk/beamerdefs.txt
copy to talk/pycon-uk-2012/talk/beamerdefs.txt
diff --git a/talk/ep2012/jit/talk/diagrams/architecture.svg
b/talk/pycon-uk-2012/talk/diagrams/architecture.svg
copy from talk/ep2012/jit/talk/diagrams/architecture.svg
copy to talk/pycon-uk-2012/talk/diagrams/architecture.svg
diff --git a/talk/ep2012/jit/talk/diagrams/pypytrace.svg
b/talk/pycon-uk-2012/talk/diagrams/pypytrace.svg
copy from talk/ep2012/jit/talk/diagrams/pypytrace.svg
copy to talk/pycon-uk-2012/talk/diagrams/pypytrace.svg
diff --git a/talk/ep2012/jit/talk/diagrams/trace.svg
b/talk/pycon-uk-2012/talk/diagrams/trace.svg
copy from talk/ep2012/jit/talk/diagrams/trace.svg
copy to talk/pycon-uk-2012/talk/diagrams/trace.svg
diff --git a/talk/ep2012/jit/talk/diagrams/tracetree.svg
b/talk/pycon-uk-2012/talk/diagrams/tracetree.svg
copy from talk/ep2012/jit/talk/diagrams/tracetree.svg
copy to talk/pycon-uk-2012/talk/diagrams/tracetree.svg
diff --git a/talk/ep2012/jit/talk/diagrams/tracing-phases.svg
b/talk/pycon-uk-2012/talk/diagrams/tracing-phases.svg
copy from talk/ep2012/jit/talk/diagrams/tracing-phases.svg
copy to talk/pycon-uk-2012/talk/diagrams/tracing-phases.svg
diff --git a/talk/ep2012/jit/talk/stylesheet.latex
b/talk/pycon-uk-2012/talk/stylesheet.latex
copy from talk/ep2012/jit/talk/stylesheet.latex
copy to talk/pycon-uk-2012/talk/stylesheet.latex
diff --git a/talk/pycon-uk-2012/talk/talk.pdf.info
b/talk/pycon-uk-2012/talk/talk.pdf.info
new file mode 100644
--- /dev/null
+++ b/talk/pycon-uk-2012/talk/talk.pdf.info
@@ -0,0 +1,11 @@
+AvailableTransitions=[Crossfade]
+TransitionDuration = 100
+EstimatedDuration = 60*60 # in seconds
+MinutesOnly = True
+
+PageProps = {
+ 1: {
+ 'reset': FirstTimeOnly,
+ 'progress': False,
+ },
+}
diff --git a/talk/pycon-uk-2012/talk/talk.rst b/talk/pycon-uk-2012/talk/talk.rst
new file mode 100644
--- /dev/null
+++ b/talk/pycon-uk-2012/talk/talk.rst
@@ -0,0 +1,587 @@
+.. include:: beamerdefs.txt
+
+================================
+PyPy JIT under the hood
+================================
+
+About me
+---------
+
+- PyPy core dev
+
+- PyPy py3k tech leader
+
+- ``pdb++``, ``fancycompleter``, ...
+
+- Consultant, trainer
+
+- You can hire me :-)
+
+- http://antocuni.eu
+
+
+About this talk
+----------------
+
+* What is PyPy? (in 30 seconds)
+
+* Overview of tracing JITs
+
+* The PyPy JIT generator
+
+
+Part 0: What is PyPy?
+----------------------
+
+* RPython toolchain
+
+ - subset of Python
+
+ - ideal for writing VMs
+
+ - JIT & GC for free
+
+* Python interpreter
+
+ - written in RPython
+
+* Whatever (dynamic) language you want
+
+ - smalltalk, prolog, javascript, ...
+
+
+Part 1
+------
+
+**Overview of tracing JITs**
+
+Compilers
+---------
+
+* When?
+
+ - Batch or Ahead Of Time
+
+ - Just In Time
+
+|pause|
+
+* How?
+
+ - Static
+
+ - Dynamic or Adaptive
+
+|pause|
+
+* What?
+
+ - Method-based compiler
+
+ - Tracing compiler
+
+|pause|
+
+* PyPy: JIT, Dynamic, Tracing
+
+
+Assumptions
+-----------
+
+* Pareto Principle (80-20 rule)
+
+ - the 20% of the program accounts for the 80% of the runtime
+
+ - **hot-spots**
+
+* Fast Path principle
+
+ - optimize only what is necessary
+
+ - fall back for uncommon cases
+
+|pause|
+
+* Most of runtime spent in **loops**
+
+* Always the same code paths (likely)
+
+
+Tracing JIT
+-----------
+
+* Interpret the program as usual
+
+* Detect **hot** loops
+
+* Tracing phase
+
+ - **linear** trace
+
+* Compiling
+
+* Execute
+
+ - guards to ensure correctness
+
+* Profit :-)
+
+
+Tracing JIT phases
+-------------------
+
+.. animage:: diagrams/tracing-phases-p*.pdf
+ :align: center
+ :scale: 100%
+
+
+Tracing Example (1)
+--------------------
+
+.. we use java instead of RPython to avoid confusion with applevel Python
+
+
+|scriptsize|
+|example<| |small| java |end_small| |>|
+
+.. sourcecode:: java
+
+ interface Operation {
+ int DoSomething(int x);
+ }
+ class IncrOrDecr implements Operation {
+ public int DoSomething(int x) {
+ if (x < 0) return x-1;
+ else return x+1;
+ }
+ }
+ class tracing {
+ public static void main(String argv[]) {
+ int N = 100;
+ int i = 0;
+ Operation op = new IncrOrDecr();
+ while (i < N) {
+ i = op.DoSomething(i);
+ }
+ System.out.println(i);
+ }
+ }
+
+|end_example|
+|end_scriptsize|
+
+
+Tracing Example (2)
+--------------------
+
+|scriptsize|
+|column1|
+|example<| |small| Java bytecode |end_small| |>|
+
+.. sourcecode:: java
+
+ class IncrOrDecr {
+ ...
+ public DoSomething(I)I
+ ILOAD 1
+ IFGE LABEL_0
+ ILOAD 1
+ ICONST_1
+ ISUB
+ IRETURN
+ LABEL_0
+ ILOAD 1
+ ICONST_1
+ IADD
+ IRETURN
+ }
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| |small| Java bytecode |end_small| |>|
+
+.. sourcecode:: java
+
+ class tracing {
+ ...
+ public static main(
+ [Ljava/lang/String;)V
+ ...
+ LABEL_0
+ ILOAD 2
+ ILOAD 1
+ IF_ICMPGE LABEL_1
+ ALOAD 3
+ ILOAD 2
+ INVOKEINTERFACE
+ Operation.DoSomething (I)I
+ ISTORE 2
+ GOTO LABEL_0
+ LABEL_1
+ ...
+ }
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+
+Tracing example (3)
+-------------------
+
+.. animage:: diagrams/trace-p*.pdf
+ :align: center
+ :scale: 80%
+
+
+Trace trees (1)
+---------------
+
+|scriptsize|
+|example<| |small| tracetree.java |end_small| |>|
+
+.. sourcecode:: java
+
+ public static void trace_trees() {
+ int a = 0;
+ int i = 0;
+ int N = 100;
+
+ while(i < N) {
+ if (i%2 == 0)
+ a++;
+ else
+ a*=2;
+ i++;
+ }
+ }
+
+|end_example|
+|end_scriptsize|
+
+Trace trees (2)
+---------------
+
+.. animage:: diagrams/tracetree-p*.pdf
+ :align: center
+ :scale: 34%
+
+
+Part 2
+------
+
+**The PyPy JIT generator**
+
+General architecture
+---------------------
+
+.. animage:: diagrams/architecture-p*.pdf
+ :align: center
+ :scale: 24%
+
+
+PyPy trace example
+-------------------
+
+.. animage:: diagrams/pypytrace-p*.pdf
+ :align: center
+ :scale: 40%
+
+
+PyPy optimizer
+---------------
+
+- intbounds
+
+- constant folding / pure operations
+
+- virtuals
+
+- string optimizations
+
+- heap (multiple get/setfield, etc)
+
+- ffi
+
+- unroll
+
+
+Intbound optimization (1)
+-------------------------
+
+|example<| |small| intbound.py |end_small| |>|
+
+.. sourcecode:: python
+
+ def fn():
+ i = 0
+ while i < 5000:
+ i += 2
+ return i
+
+|end_example|
+
+Intbound optimization (2)
+--------------------------
+
+|scriptsize|
+|column1|
+|example<| |small| unoptimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ i17 = int_lt(i15, 5000)
+ guard_true(i17)
+ i19 = int_add_ovf(i15, 2)
+ guard_no_overflow()
+ ...
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| |small| optimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ i17 = int_lt(i15, 5000)
+ guard_true(i17)
+ i19 = int_add(i15, 2)
+ ...
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+|pause|
+
+* It works **often**
+
+* array bound checking
+
+* intbound info propagates all over the trace
+
+
+Virtuals (1)
+-------------
+
+|example<| |small| virtuals.py |end_small| |>|
+
+.. sourcecode:: python
+
+ def fn():
+ i = 0
+ while i < 5000:
+ i += 2
+ return i
+
+|end_example|
+
+
+Virtuals (2)
+------------
+
+|scriptsize|
+|column1|
+|example<| |small| unoptimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ guard_class(p0, W_IntObject)
+ i1 = getfield_pure(p0, 'intval')
+ i2 = int_add(i1, 2)
+ p3 = new(W_IntObject)
+ setfield_gc(p3, i2, 'intval')
+ ...
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| |small| optimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ i2 = int_add(i1, 2)
+ ...
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+|pause|
+
+* The most important optimization (TM)
+
+* It works both inside the trace and across the loop
+
+* It works for tons of cases
+
+ - e.g. function frames
+
+
+Constant folding (1)
+---------------------
+
+|example<| |small| constfold.py |end_small| |>|
+
+.. sourcecode:: python
+
+ def fn():
+ i = 0
+ while i < 5000:
+ i += 2
+ return i
+
+|end_example|
+
+
+Constant folding (2)
+--------------------
+
+|scriptsize|
+|column1|
+|example<| |small| unoptimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ i1 = getfield_pure(p0, 'intval')
+ i2 = getfield_pure(<W_Int(2)>,
+ 'intval')
+ i3 = int_add(i1, i2)
+ ...
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| |small| optimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ i1 = getfield_pure(p0, 'intval')
+ i3 = int_add(i1, 2)
+ ...
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+|pause|
+
+* It "finishes the job"
+
+* Works well together with other optimizations (e.g. virtuals)
+
+* It also does "normal, boring, static" constant-folding
+
+
+Out of line guards (1)
+-----------------------
+
+|example<| |small| outoflineguards.py |end_small| |>|
+
+.. sourcecode:: python
+
+ N = 2
+ def fn():
+ i = 0
+ while i < 5000:
+ i += N
+ return i
+
+|end_example|
+
+
+Out of line guards (2)
+----------------------
+
+|scriptsize|
+|column1|
+|example<| |small| unoptimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ quasiimmut_field(<Cell>, 'val')
+ guard_not_invalidated()
+ p0 = getfield_gc(<Cell>, 'val')
+ ...
+ i2 = getfield_pure(p0, 'intval')
+ i3 = int_add(i1, i2)
+
+|end_example|
+
+|pause|
+
+|column2|
+|example<| |small| optimized |end_small| |>|
+
+.. sourcecode:: python
+
+ ...
+ guard_not_invalidated()
+ ...
+ i3 = int_add(i1, 2)
+ ...
+
+|end_example|
+|end_columns|
+|end_scriptsize|
+
+|pause|
+
+* Python is too dynamic, but we don't care :-)
+
+* No overhead in assembler code
+
+* Used a bit "everywhere"
+
+* Credits to Mark Shannon
+
+ - for the name :-)
+
+Guards
+-------
+
+- guard_true
+
+- guard_false
+
+- guard_class
+
+- guard_no_overflow
+
+- **guard_value**
+
+Promotion
+---------
+
+- guard_value
+
+- specialize code
+
+- make sure not to **overspecialize**
+
+- example: type of objects
+
+- example: function code objects, ...
+
+Conclusion
+-----------
+
+- PyPy is cool :-)
+
+- Any question?
diff --git a/talk/ep2012/jit/talk/title.latex
b/talk/pycon-uk-2012/talk/title.latex
copy from talk/ep2012/jit/talk/title.latex
copy to talk/pycon-uk-2012/talk/title.latex
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit