a program which is intended to accomplish multiple tasks  at the same time  through the use of either multiple cores/processors on the same machine or multiple machines
divide a large task into parts by function or by data gain efficiency by using different processors to simultaneously execute parts of a task
programming in a language that allows you to explicitly indicate how different portions of the computation may be executed concurrently by different processors