1. A method of parallel execution of a program comprising the steps of: a) creating a distilled version of the program adapted to execute faster on a processor than the program would execute on the processor; b) executing the distilled version of the program on a primary processor; c) periodically transferring state information from the primary processor to a secondary processor; d) commencing execution by the secondary processor of a portion of the program starting at a point corresponding to where the checkpoint was taken by the primary processor using the state information from the distilled version of the program; and e) repeating steps (b)-(d) for additional checkpoints and using different processors for the secondary processor.