This is the SPO600 course schedule. It's a live document and will be revised as the course proceed. Each topic will be linked to notes at the end of this page as the course proceeds.
Week | Week of … | Class I (Tuesday - Syncronous on Zoom) | Class II (Thursday - Asynchronous) | Deliverables |
---|---|---|---|---|
Week 1 | September 2 | Introduction, Course Setup (incl SSH Keys) | Binary Representation of Data, Introduction to Computer Architecture | Setup Communication Tools |
Week 2 | September 9 | Introduction to 6502 Assembly Language | 6502 Math and Flow Control | Lab 1 |
Week 3 | September 16 | 6502 Math | Compiler Internals and Compiler Flags | Lab 2 |
Week 4 | September 23 | 6502 Strings | Compiler Optimizations | Lab 3 |
Week 5 | September 30 | 64-Bit Assembler | SIMD, SVE, & SVE2 | Blog posts group 1 |
Week 6 | October 7 | 64-Bit Assembler Lab | IFunc, FMV, AFMV | Lab 4 |
Week 7 | October 14 | Building GCC, Initial Project Discussion | Project Stage 1 Details | Project bogging |
Reading Week | October 21 | Reading Week | ||
Week 8 | October 28 | Project Discussion | Profiling | Project Stage 1, Blog posts group 2 |
Week 9 | November 4 | Strategies for AFMV Paring | Paged Memory Concepts | Project blogging |
Week 10 | November 11 | Project Discussion | Advanced Memory Concepts | Project blogging |
Week 11 | November 18 | Project Discussion | Memory Access in Multicore Systems | Project stage 2, Blog posts group 3 |
Week 12 | November 25 | Strategies for Landing AFMV | Project Recommendations | Project blogging |
Week 13 | December 2 | Project Discussion | Project Recommendations | Project blogging |
Week 14 | December 9 | Course Wrap-Up | No class | Project Stage 3, Blog posts group 4 |
See the SPO600 2024 Fall Participants page.
Note: these summary videos are no substitute for attending class in-person! It does not include: quizzes and quiz answer discussion, group exercises, and group discussion. It may take several days to process and edit the video before it is made available. It may not record properly and may not be made available. Do not rely only on the summary videos!
Optimization is the process of evaluating different ways that software can be written or built and selecting the option(s) that has the best performance tradeoffs for the situation at hand.
Optimization may involve substituting software algorithms, altering the sequence of operations, using architecture-specific code, selecting data types, or altering the build process. It is important to ensure that the optimized software produces correct results and does not cause an unacceptable performance regression for other use-cases, system configurations, operating systems, or architectures.
The definition of “performance” varies according to the target system and the operating goals. For example, in some contexts, low memory or storage usage is important; in other cases, fast operation; and in other cases, low CPU utilization or long battery life may be the most important factor. It is often necessary to trade off performance in one area for another; using a lookup table, for example, can reduce CPU utilization and improve battery life in some algorithms, in return for increased memory consumption.
Virtually all compilers (and interpreters) perform some level of optimization, and the options selected for compilation can have a significant effect on the trade-offs made by the compiler, affecting memory usage, execution speed, executable size, power consumption, and debuggability.
However, there are some types of optimization that cannot be applied by the compiler, and which must be applied by the programmer.
Building software is a complex task that many developers gloss over. The simple act of compiling a program invokes a process with five or more stages, including pre-processing, compiling, optimizing, assembling, and linking. However, a complex software system will have hundreds or even thousands of source files, as well as dozens or hundreds of build configuration options, auto configuration scripts (cmake, autotools), build scripts (such as Makefiles) to coordinate the process, test suites, and more.
The build process varies significantly between software packages. Most software distribution projects (including Linux distributions such as Ubuntu and Fedora) use a packaging system that further wraps the build process in a standardized script format, so that different software packages can be built using a consistent process.
In order to get consistent and comparable benchmark results, you need to ensure that the software is being built in a consistent way. Altering the build process is one way of optimizing software.
Note that the build time for a complex package can range up to hours or even days!
Benchmarking involves testing software performance under controlled conditions so that the performance can be compared to other software, the same software operating on other types of computers, or so that the impact of a change to the software can be gauged.
Profiling is the process of analyzing software performance on finer scale, determining resource usage per program part (typically per function/method). This can identify software bottlenecks and potential targets for optimization. The resource utilization studies may include memory, CPU cycles/time, or power.
Follow the instructions on the SPO600 Communication Tools page to set up a blog, create SSH keys, and send your blog URLs and public key to me.
I will use this information to:
The updating is done in batches every few days – allow some time!
The 6502 Processor is a simple 8-bit processor that powered a number of early microcomputers (and video games). We're going to use it to learn machine language and assembly language concepts before tackling modern processors (because the 6502 instruction set can be documented in one page rather than 7000 pages!).
Due to a power + Internet outage, these videos are from a previous semester.
* Set up your SPO600 Communication Tools
Due to techical issues, the content for Week 6 - Class II will be covered in the October 15th class.