並列と並行の違い

並列(Parallel)と並行(Concurrent)はあまり区別されなかったり、混同されていたりしますが別のことを指す言葉です。
よく見られるわかりやすい区別の仕方は、マルチスレッドのプログラムを一つのCPU上で実行している状態は並行で、複数のCPUで実行している状態は並列だというものです。一般的に言うと並行は「複数の実行の流れが一つの基準による順序性を持って(同期的に)実行されている状態」のことで、並列は「複数の実行の流れが基準を持たずに(非同期的に)実行されている状態」のことです。

「並列処理は実行順が不定なのが有害なので、プログラマーが同期プリミティブを用いて決定論的に動作するようにプログラミングすべきだ」という人がいたりしますが、非同期的な動作は並列処理の本質なので、それを否定しつつ並列処理から何らかの恩恵を得たいというのは無理な話です。並列処理を行う場合は並列区間が非同期に実行されても結果の正当性を保証できるように設計するのが正道になります。