Parallel computing those that use concurrency, are more difficult to write than sequential ones, because concurrency introduces several new classes of potential software bugs, of which race conditions are the most common. Communication and synchronization between the different subtasks are typically some of the greatest obstacles to getting good parallel program performance. A theoretical upper bound on the speed-up of a single program as a result of parallelization is given by Amdahl's law. Traditionally, computer software has been written for serial computation. To solve a problem, an algorithm is constructed and implemented as a serial stream of instructions. These instructions are executed
NAS Parallel Benchmarks serial versions of the benchmarks consistent with the parallel versions and defined a problem size "Class W" for small-memory systems. NPB 2.4 of 2002 offered a new MPI implementation and introduced another still larger problem size "Class D". It also augmented one benchmark with I/O-intensive subtypes. NPB 3 retained the MPI implementation from NPB 2 and came in more flavors, namely OpenMP, Java and High Performance Fortran. These new parallel implementations were derived from the serial codes in NPB 2.3 with additional optimizations. NPB 3.1 and NPB 3.2 added three more benchmarks, which, however, were not available across all implementations;