 For this next topic, we're going to be looking at parallelization. And while there are several different types of parallelization we can look at, the basic idea is that parallelization allows a machine to run more than one operation at a time. So there are many different ways we can implement parallelization. When we get to the architecture part of this course, we're going to be building a computer that implements pipelining, and we'll extend that to include symmetric multithreading. And while we're there, we'll also look at SIMD processors. Chances are you're familiar with multi-core processors. That's what the vast majority of the processors we build these days are. Anything that has more than one processing unit on the same chip die. There's also multi-processor computers. These aren't as popular, but to some degree you could just consider a machine that has a central processing unit and a graphics processing unit to also be a machine with two processors. You can't offload everything to your GPU, but for a lot of tasks you can. The last example of parallelization is with clusters. Clusters are really just a large collection of machines, each of which is going to be running a separate task or a separate part of a task. So you get many parts of your computation run at the same time. For these examples, we're going to be focusing on pretty much the case of multi-core processors. Though for most extents and purposes, symmetric multithreading is pretty similar to multi-core processors. Symmetric multithreading will work pretty similarly to multi-core. And for a given example, we may assume that they do, but there are some cases where symmetric multithreading runs into problems and doesn't perform quite as well as we might hope.