Difference between revisions of "Fall 2023 SPO600 Weekly Schedule"

From CDOT Wiki
Jump to: navigation, search
Line 1: Line 1:
[[Category:Fall 2022 SPO600]]
+
[[Category:Fall 2023 SPO600]]
 
This is the schedule and main index page for the [[SPO600]] ''Software Portability and Optimization'' course for Fall 2022.
 
This is the schedule and main index page for the [[SPO600]] ''Software Portability and Optimization'' course for Fall 2022.
 
<!-- {{Admon/important|It's Alive!|This [[SPO600]] weekly schedule will be updated as the course proceeds - dates and content are subject to change. The cells in the summary table will be linked to relevant resources and labs as the course progresses.}} -->
 
<!-- {{Admon/important|It's Alive!|This [[SPO600]] weekly schedule will be updated as the course proceeds - dates and content are subject to change. The cells in the summary table will be linked to relevant resources and labs as the course progresses.}} -->

Revision as of 09:12, 6 September 2023

This is the schedule and main index page for the SPO600 Software Portability and Optimization course for Fall 2022.

Important.png
Content being Updated
This page is in the process of being updated from a previous semester's content. It is not yet updated for the current semester. Do not rely on the accuracy of this information until this warning is removed.


Schedule Summary Table

Please follow the links in each cell for additional detail which will be added below as the course proceeds -- especially for the Deliverables column.

Week Week of... Class I
Monday 1:30-3:15
Class II
Wednesday 10:45-12:30
Deliverables
(Summary - click for details)
1 Sep 4 (No class - Labour day) Introduction to the Course / Introduction to the Problem / Computer Architecture Basics Set up for the course / Lab 1
2 Sep 11 Binary Representation of Data / Introduction to 6502 Assembly 6502 Math / Jumps, Branches, and Subroutines Lab 2
3 Sep 18 6502 Strings 6502 String Input / Building Code: Make and Makefiles Lab 3
4 Sep 25 Compiler Optimizations Building Code: Compiler Options, GNU Autotools/Automake Lab 3, September blog posts
5 Oct 2 Introduction to 64-bit Architectures and Assembly Language (x86_64 and AArch64) Memory on 64-bit Systems Lab 4
6 Oct 9 (No class - Thanksgiving day) Algorithm Selection / In-line Assembler / SIMD Lab 5
7 Oct 16 Exploring 64-bit Code SVE2 Wrap up lab 5
Reading Oct 23 Reading Week
8 Oct 30 Optimization Trade-Offs / Algorithm Selection / Inline Assembler / SIMD Scalable Vector Extensions (SVE/SVE2) via Inline Assembler and C Intrinsics October blog posts
9 Nov 6 GNU ifunc & Project Overview Project Detail Blog about ifunc and your project work
10 Nov 13 Project Tips Advanced Memory Blog about project work
11 Nov 20 Project Techniques Project Demo Blog about project work
12 Nov 27 Benchmarking Step-by-Step Project Minimum Requirements Blog about project work, November blog posts
13 Dec 4 Enhancing Your Project Project Discussion Blog about project work; Project Stage 2 due Thursday December 8 at Noon
14 Dec 11 Future Directions in Architecture (No class) Project Stage 3, December blog posts


Week 1

Week 1 - Class I

General Course Information

  • Course resources are linked from the CDOT wiki, starting at https://wiki.cdot.senecacollege.ca/wiki/SPO600 (Quick find: This page will usually be Google's top result for a search on "SPO600"), arranged by week and class. There will be lots of hyperlinks -- be sure to follow these links.
  • Coursework is submitted by blogging. The only exception to this is quizzes.
  • Quizzes will be short (~1 page) and will be held without announcement at the start of any synchronous class. There is no opportunity to re-take a missed quiz, but your lowest three quiz scores will not be counted, so do not worry if you miss one or two.
    • Students with test accommodations: an alternate monthly quiz can be made available via the Test Centre. Communicate with your professor for details.
  • Course marks (see Weekly Schedule for dates):
    • 60% - Project Deliverables in three phases (15%, 20%, 25%)
    • 20% - Communication (Blog writing, in four phases roughly a month long each, 5% each)
    • 20% - Labs and Quizzes (10% labs; 10% for quizzes - lowest 3 quiz scores not counted)

Introduction to the Problems

Porting and Portability
  • Most software is written in a high-level language which can be compiled into machine code for a specific computer architecture. In many cases, this code can be compiled or interpreted for execution on multiple computer architectures - this is called 'portable' code. However, there is a lot of existing code that contains some architecture-specific code fragments which contains assumptions about the architecture, resulting in architecture-specific high-level or Assembly Language code.
  • Reasons that code is architecture-specific:
    • System assumptions that don't hold true on other platforms
    • Code that takes advantage of platform-specific features
  • Reasons for writing code in Assembly Language include:
    • Performance
    • Atomic Operations
    • Direct access to hardware features, e.g., CPUID registers
  • Most of the historical reasons for using assembler are no longer valid. Modern compilers can out-perform most hand-optimized assembly code, atomic operations can be handled by libraries or compiler intrinsics, and most hardware access should be performed through the operating system or appropriate libraries.
  • A new architecture has appeared: AArch64, which is part of ARMv8. This is the first new computer architecture to appear in several years (at least, the first mainstream computer architecture).
  • At this point, most key open source software (the software typically present in a Linux distribution such as Ubuntu or Fedora, for example) now runs on AArch64. However, it may not yet be as extensively optimized as on older architectures (such as x86_64).
Benchmarking and Profiling

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.

Optimization

Optimization is the process of evaluating different ways that software can be written or built and selecting the option that has the best performance tradeoffs.

Optimization may involve substituting software algorithms, altering the sequence of operations, using architecture-specific code, 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 possible 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.

Most advanced compilers 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.

Build Process

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!

Course Setup

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:

  1. Update the Current SPO600 Participants page with your information, and
  2. Create an account for you on the SPO600 Servers.

This updating is done in batches once or twice a week -- allow some time!

How open source communities work



Week 1 Deliverables

  1. Follow the SPO600 Communication Tools set-up instructions.
  2. Optional (strongly recommended): Set up a personal Linux system.
  3. Optional: If you have an AArch64 development board (such as a Raspberry Pi 4, Raspberry Pi 400, or 96Boards device), consider installing a 64-bit Linux operating system such as Fedora on it.
  4. Start work on Lab 1. Blog your work.