"Creating software is still something a lot of people can do, but if they had to deal with parallelism, it becomes much more difficult," says Amarasinghe.In single-core machines, software code runs, for the most part, sequentially. This means that tasks--such as accessing certain chunks of memory to open a program--occur one after another, in a predictable way. In a multicore system, tasks get split up among cores. And when different tasks need to access the same chunk of memory, the tasks have to work together to carefully orchestrate--or synchronize--the accesses. If multiple tasks inadvertently access the same data without proper synchronization, the data will get corrupted, producing incorrect results or crashing the program.