1 / 31

Optimizing and Debugging Programs in Allegro CL

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

seth
Download Presentation

Optimizing and Debugging Programs in Allegro CL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007

  2. Introduction • Personal • Tutorial will become available via ftp • Some things available only in 8.1 • Some concepts are from LUGM/1998

  3. Outline • Debug • Low Level Hacks • Optimization

  4. Debug • Zoom Niceties • [ run zoom.lisp] • gdb/dbx/windbg interface • [ show manual demos]

  5. Low Level Hacks • Intro: Structure of Allegro CL • “ll” functions • Lap code

  6. Structure of Allegro CL src/ code/*.cl c/*.c rs/*.cl compile cc compile *.fasl *.s asm *.o

  7. Structure (cont) *.fasl *.o lisp ld *.so running lisp lisp (dumplisp) libacl*.so *.dxl

  8. 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))

  9. Example lisp ll code • [run “both-fixnum-p.lisp”]

  10. “ll” functions • [see ll-doc.html]

  11. Another ll example • Some compiler-macros expand to ll funcs • [run char-code.lisp]

  12. Lap code • comp::*hack-compiler-output* • [run hack-compiler-output.lisp] • comp::*assemble-function-body* • [run assemble-function-body.lisp]

  13. Optimization • Compilation • Boxing and unboxing • Read-line • Foreign types • Memcpy • String manipulation • Aligned pointers • Hashing • Runtime Analyzer

  14. Optimization Methodology • Get it right first • Profile it • The time macro • The Allegro CL Runtime Analyzer • Hit the high cost items • Implementations • Algorithms

  15. Compilation • Adding declarations to code • (declare (:explain :types :inlining)) • [run inlining-demos.lisp]

  16. Boxing and Unboxing • Ensuring optimal unboxability • [run unboxing.lisp] • Immediate args • [see immediate-args.html]

  17. read-line • What's wrong with it?

  18. 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]

  19. memcpy • memcpy-up • memcpy-down • [see memcpy-demo.html]

  20. String Manipulation • string+ and the standard, with concatenate • [see string+.cl]

  21. 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”]

  22. Aligned Pointers (cont) unsigned for 32-bit: signed fixnum 0 0 #x7ffffffc most-positive-fixnum #x80000000 most-negative-fixnum #xfffffffc -1 (fix)

  23. Foreign types • (sorry, under construction): • Foreign-types aren't just for foreign-functions • We can combine disciplines • [run mapped-aligned-ftype.lisp]

  24. 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

  25. 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]

  26. Hashing • Hash tables are very efficient if hash codes are well-distributed • excl::hash-table-stats • [run hash-table-stats.lisp]

  27. 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

  28. Time macro: extra closures • This driver is not as simple as it looks! (defun test-driver (n) (time (dotimes (i n) (test-it)))

  29. Time macro: avoiding extra closures • Use this instead: (defun test-driver (n) (dotimes (i n) (test-it)) (time (test-driver 1000000))

  30. disassemble-profile • Provides sample hit counts and percentages • Multiple disassembles provide info similar to call-graph • [show manual demo]

  31. Thank You.

More Related