* The CPU has usurped functionality over time
* Encryption in your phone CPU, for example
---
## Future Constraints?
* So if the CPU has done more and more, will registers go away in the future?
* Could we simply work in memory directly?
* Probably not; one is optimized for speed, the other for density
* Adding a section to the chip die to handle encryption is okay
* The long delay sending it data and getting it back is a small price to pay for the hardware encryption
---
## 2D Space
* Add more registers and some of them will get farther away
* This means more, and longer, wires to transmit data
* Those wires eat more space and take more time
* Since clock cycles can only be as fast as the slowest part, eventually you'll slow down the clock rate
* GPUs have much more parallelism because they are optimized for different work
---
## Locality
* Because of that, the locality of memory will (likely) continue to be a concern
* Learning to write memory aware code is the best way to speed up large programs
* But we will also need to understand what the code is doing to optimize it
* And often that means looking at the assembly
---
## Let's Talk Debugging
* So let's briefly talk about a different topic: debugging
* We've already used gdb to look at programs
* Did you know that you can use it with assembly too?
---
## Loading Assembly Files
* Build an assembly file with `gcc -S