This course introduces basic hardware techniques behind the computers you are programming and evaluates performance impacts of specific hardware/software improvements. Students will learn principles and organizational paradigms that determine capabilities, performance, and success of computer systems. The course starts with performance evaluation of computer systems. A simple processor will be constructed from the instruction set design to its whole datapath design. Basic memory systems will be discussed in detail. Advanced topics including storage, I/O, and multicore systems will also be addressed.