F RANZ I NC. Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007.
-
Upload
cathleen-barker -
Category
Documents
-
view
217 -
download
0
Transcript of F RANZ I NC. Optimizing and Debugging Programs in Allegro CL By Duane Rettig April, 2007.
FRANZ INC.
Optimizing and Debugging Programs in Allegro CL
By Duane Rettig
April, 2007
FRANZ INC.
Introduction
• Personal• Tutorial will become available via ftp• Some things available only in 8.1• Some concepts are from LUGM/1998
FRANZ INC.
Outline
• Debug• Low Level Hacks• Optimization
FRANZ INC.
Debug
• Zoom Niceties– [ run zoom.lisp]
• gdb/dbx/windbg interface– [ show manual demos]
FRANZ INC.
Low Level Hacks
• Intro: Structure of Allegro CL• “ll” functions• Lap code
FRANZ INC.
Structure of Allegro CLsrc/
c/*.crs/*.clcode/*.cl
compilecompile
asm*.s *.o*.fasl
cc
FRANZ INC.
Structure (cont)*.o
*.so ld
*.fasl
libacl*.so
lisp
lisp
(dumplisp)
running lisp
*.dxl
FRANZ INC.
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))
FRANZ INC.
Example lisp ll code• [run “both-fixnum-p.lisp”]
FRANZ INC.
“ll” functions• [see ll-doc.html]
FRANZ INC.
Another ll example
• Some compiler-macros expand to ll funcs– [run char-code.lisp]
FRANZ INC.
Lap code
• comp::*hack-compiler-output*– [run hack-compiler-output.lisp]
• comp::*assemble-function-body*– [run assemble-function-body.lisp]
FRANZ INC.
Optimization
• Compilation• Boxing and unboxing• Read-line• Foreign types• Memcpy• String manipulation• Aligned pointers• Hashing• Runtime Analyzer
FRANZ INC.
Optimization Methodology
• Get it right first• Profile it
– The time macro– The Allegro CL Runtime Analyzer
• Hit the high cost items– Implementations– Algorithms
FRANZ INC.
Compilation
• Adding declarations to code• (declare (:explain :types :inlining))
– [run inlining-demos.lisp]
FRANZ INC.
Boxing and Unboxing
• Ensuring optimal unboxability– [run unboxing.lisp]
• Immediate args– [see immediate-args.html]
FRANZ INC.
read-line
• What's wrong with it?
FRANZ INC.
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]
FRANZ INC.
memcpy
• memcpy-up• memcpy-down• [see memcpy-demo.html]
FRANZ INC.
String Manipulation
• string+ and the standard, with concatenate• [see string+.cl]
FRANZ INC.
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”]
FRANZ INC.
Aligned Pointers (cont)
most-positive-fixnum
most-negative-fixnum
for 32-bit: signed fixnumunsigned
0
#x7ffffffc
#x80000000
0
#xfffffffc -1 (fix)
FRANZ INC.
Foreign types• (sorry, under construction):• Foreign-types aren't just for foreign-functions• We can combine disciplines
– [run mapped-aligned-ftype.lisp]
FRANZ INC.
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
FRANZ INC.
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]
FRANZ INC.
Hashing
• Hash tables are very efficient if hash codes are well-distributed
• excl::hash-table-stats– [run hash-table-stats.lisp]
FRANZ INC.
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
FRANZ INC.
•Time macro: extra closures
• This driver is not as simple as it looks!
(defun test-driver (n)
(time
(dotimes (i n)
(test-it)))
FRANZ INC.
•Time macro: avoiding extra closures
• Use this instead:
(defun test-driver (n)
(dotimes (i n)
(test-it))
(time (test-driver 1000000))
FRANZ INC.
disassemble-profile
• Provides sample hit counts and percentages• Multiple disassembles provide info similar to
call-graph• [show manual demo]
FRANZ INC.
Thank You.