As multi-processors become mainstream, software developers must harness the parallelism available in programs to keep up with multi-core performance. Writing parallel programs, however, is notoriously difficult, even for the most advanced programmers. This article explores hardware and software avenues for improving the programmability of Intel multi-processors. This paper also investigates techniques for reproducing a non-deterministic program execution that can efficiently deal with the issues just mentioned.