310 likes | 403 Views
Optimizing and Debugging Programs in Allegro CL. By Duane Rettig. April, 2007. Introduction. Personal Tutorial will become available via ftp Some things available only in 8.1 Some concepts are from LUGM/1998. Outline. Debug Low Level Hacks Optimization. Debug. Zoom Niceties
E N D
Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007
Introduction • Personal • Tutorial will become available via ftp • Some things available only in 8.1 • Some concepts are from LUGM/1998
Outline • Debug • Low Level Hacks • Optimization
Debug • Zoom Niceties • [ run zoom.lisp] • gdb/dbx/windbg interface • [ show manual demos]
Low Level Hacks • Intro: Structure of Allegro CL • “ll” functions • Lap code
Structure of Allegro CL src/ code/*.cl c/*.c rs/*.cl compile cc compile *.fasl *.s asm *.o
Structure (cont) *.fasl *.o lisp ld *.so running lisp lisp (dumplisp) libacl*.so *.dxl
Example rs code (def-runtime-q new-ratio (num den) (let ((rat (q-allocate-heap-other #md-ratio-type-code #md-ratio-size))) (setf (ls md-ratio num rat) num) (setf (ls md-ratio den rat) den) rat))
Example lisp ll code • [run “both-fixnum-p.lisp”]
“ll” functions • [see ll-doc.html]
Another ll example • Some compiler-macros expand to ll funcs • [run char-code.lisp]
Lap code • comp::*hack-compiler-output* • [run hack-compiler-output.lisp] • comp::*assemble-function-body* • [run assemble-function-body.lisp]
Optimization • Compilation • Boxing and unboxing • Read-line • Foreign types • Memcpy • String manipulation • Aligned pointers • Hashing • Runtime Analyzer
Optimization Methodology • Get it right first • Profile it • The time macro • The Allegro CL Runtime Analyzer • Hit the high cost items • Implementations • Algorithms
Compilation • Adding declarations to code • (declare (:explain :types :inlining)) • [run inlining-demos.lisp]
Boxing and Unboxing • Ensuring optimal unboxability • [run unboxing.lisp] • Immediate args • [see immediate-args.html]
read-line • What's wrong with it?
read-line • It always conses! • What to do? • read-line-into • Never conses • Must deal with overflowing lines • simple-stream-read-line • Two modes • implementation for read-line • similar to read-line, handling overflows • [see read-line-test.html]
memcpy • memcpy-up • memcpy-down • [see memcpy-demo.html]
String Manipulation • string+ and the standard, with concatenate • [see string+.cl]
Aligned Pointers • Allow cons-free pointer manipulation • Pointers look like fixnums • Pointers must be aligned to: • 32-bit: 4-byte boundaries • 64-bit: 8-byte boundaries • [see “aligned.html”]
Aligned Pointers (cont) unsigned for 32-bit: signed fixnum 0 0 #x7ffffffc most-positive-fixnum #x80000000 most-negative-fixnum #xfffffffc -1 (fix)
Foreign types • (sorry, under construction): • Foreign-types aren't just for foreign-functions • We can combine disciplines • [run mapped-aligned-ftype.lisp]
Hashing • :test extensions • :values [t] (may be nil or :weak) • :weak-keys [nil] (may be non-nil) • :hash-function [nil] (or fboundp symbol) • must return • 24 bit value for 32-bit lisps • 32 bit value for 64-bit lisps
Hashing • Rehash-issues • excl::*default-rehash-size* • excl::*allocate-large-hash-table-vectors-in-old-space* • excl::convert-to-internal-fspec • example of weak-key, sans-value hash-table • [run shared-cons-table.lisp]
Hashing • Hash tables are very efficient if hash codes are well-distributed • excl::hash-table-stats • [run hash-table-stats.lisp]
Runtime Analyzer • (explain the name) • Always compile top-level test functions • Do not use time macro with profiler • Avoid simultaneous time/call-count profiles • When using time macro, beware of new closures • Use prof:disassemble-profile
Time macro: extra closures • This driver is not as simple as it looks! (defun test-driver (n) (time (dotimes (i n) (test-it)))
Time macro: avoiding extra closures • Use this instead: (defun test-driver (n) (dotimes (i n) (test-it)) (time (test-driver 1000000))
disassemble-profile • Provides sample hit counts and percentages • Multiple disassembles provide info similar to call-graph • [show manual demo]