Difference between revisions of "Winter 2022 SPO600 Weekly Schedule"

From CDOT Wiki
Jump to: navigation, search
(Created page with "These pages are specifically related to the Winter 2022 edition of the SPO600 course.")
 
Line 1: Line 1:
These pages are specifically related to the Winter 2022 edition of the [[SPO600]] course.
+
[[Category:Winter 2022 SPO600]]
 +
This is the schedule and main index page for the [[SPO600]] ''Software Portability and Optimization'' course for Fall 2021.
 +
<!-- {{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|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.}}
 +
<!-- {{Admon/obsolete|[[Current SPO600 Weekly Schedule]]}} -->
 +
 
 +
== Schedule Summary Table ==
 +
 
 +
This is a summary/index 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.
 +
 
 +
{|cellspacing="0" width="100%" cellpadding="5" border="1" style="background: #e0e0ff"
 +
|-
 +
!Week!!Week of...!!width="28%"|Class I<br/>Tuesday 11:40-1:30!!width="28%"|Class II<br/>Friday 9:50-11:40!!width="28%"|Deliverables<br/>(Summary - click for details)
 +
 
 +
|-
 +
|1||Jan 10||[[#Week 1 - Class I|Introduction to the Course / Introduction to the Problem / Computer Architecture Basics]]||[[#Week 1 - Class II|Binary Representation of Data]]||[[#Week 1 Deliverables|Set up for the course / Lab 1]]
 +
|-
 +
|2||Jan 17||[[#Week 2 - Class I|Introduction to 6502 Assembly]]||[[#Week 2 - Class II|Writing and Debugging 6502 Code / Assembly Language Conventions / Using Macros Effectively]]||[[#Week 2 Deliverables|Lab 2]]
 +
|-
 +
|3||Jan 24||[[#Week 3 - Class I|6502 Math / Jumps, Branches, and Subroutines]]||[[#Week 3 - Class II|6502 Strings]]||[[#Week 3 Deliverables|Lab 3]]
 +
|-
 +
|4||Jan 31||[[#Week 4 - Class I|Introduction to 64-bit Assembly (x86_64 and AArch64) / Modern Architectural Enhancements]]||[[#Week 4 - Class II|Building Code / Make and Makefiles / Autotools and Friends]]||[[#Week 4 Deliverables|Lab 4, January blog posts]]
 +
|-
 +
|5||Feb 07||[[#Week 5 - Class I|More 64-bit Assemly]]||[[#Week 5 - Class II|Compiler Optimizations]]||[[#Week 5 Deliverables|Lab 5]]
 +
|-
 +
|6||Feb 14||[[#Week 6 - Class I|SIMD]]||[[#Week 6 - Class II|Inline Assembly]]||[[#Week 6 Deliverables|Lab 6]]
 +
|-
 +
|7||Feb 21||[[#Week 7 - Class I|Using ARMv9 instructions (for SVE2) on an ARMv8 system]]||[[#Week 7 - Class II|Project Selection]]||[[#Week 7 Deliverables|Lab 7]]
 +
|-
 +
|Reading||Oct 25||style="background: #f0f0ff" colspan="2" align="center"|Reading Week||February Blog Posts
 +
|-
 +
|8||Mar 07||[[#Week 8 - Class I|Benchmarking and Profiling]]||[[#Week 8 - Class II|Project Stage 1]]||[[#Week 8 Deliverables|Project Stage 1]]
 +
|-
 +
|9||Mar 14||[[#Week 9 - Class I|Memory System Design - Paging / Virtual Memory]]||[[#Week 9 - Class II|Project Discussion]]||[[#Week 9 Deliverables|Blog about project work]]
 +
|-
 +
|10||Mar 21||[[#Week 10 - Class I|Memory - Cache / NUMA]]||[[#Week 10 - Class II|Project Discussion]]||[[#Week 10 Deliverables|Blog about project work]]
 +
|-
 +
|11||Mar 28||[[#Week 11 - Class I|Memory - Observability, Barriers]]||[[#Week 11 - Class II|Project Stage 2]]||[[#Week 11 Deliverables|Project Stage 2, March Blog Posts]]
 +
|-
 +
|12||Apr 04||[[#Week 12 - Class I|Atomic Operations]]||[[#Week 12 - Class II|Project Discussion]]||[[#Week 12 Deliverables|Blog about project work]]
 +
|-
 +
|13||Apr 11||[[#Week 13 - Class I|Project Discussion]]||style="background: #f0f0ff"|Good Friday||[[#Week 13 Deliverables|Blog about project work]]
 +
|-
 +
|14||Apr 18||[[#Week 14 - Class I|Future Directions in Architecture]]||[[#Week 14 - Class II|Project Stage 3]]||[[#Week 14 Deliverables|Project Stage 3, April Blog Posts]]
 +
|-
 +
 
 +
 
 +
|}
 +
 
 +
== Week 1 ==
 +
 
 +
=== Week 1 - Class I ===
 +
 
 +
==== Introduction to the Problems ====
 +
 
 +
===== Porting and Portability =====
 +
* Most software is written in a '''high-level language''' which can be compiled into [[Machine Language|machine code]] for a specific computer architecture. In many cases, this code can be compiled for multiple architectures. However, there is a lot of existing code that contains some architecture-specific code fragments which contains assumptions based on the architecture written in architecture-specific high-level code or in [[Assembly Language]].
 +
* Reasons that code is architecture-specific:
 +
** System assumptions that don't hold true on other platforms
 +
*** Variable or [[Word|word]] size
 +
*** [[Endian|Endianness]]
 +
** Code that takes advantage of platform-specific features
 +
* Reasons for writing code in Assembly Langauge include:
 +
** Performance
 +
** [[Atomic Operation|Atomic Operations]]
 +
** Direct access to hardware features, e.g., CPUID registers
 +
* Most of the historical reasons for including 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|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 [http://www.arm.com/products/processors/instruction-set-architectures/armv8-architecture.php ARMv8]. This is the first new [[Computer Architecture|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 run as well 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.
 +
 
 +
===== 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-proccessing, 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!
 +
 
 +
==== 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").
 +
* Coursework is submitted by blogging.
 +
* 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. See your professor for details.
 +
* Course marks (see Weekly Schedule for dates):
 +
** 60% - Project Deliverables
 +
** 20% - Communication (Blog and Wiki writing)
 +
** 20% - Labs and Quizzes (10% labs - completed/not completed; 10% for quizzes - lowest 3 scores not counted)
 +
 
 +
==== Classes ====
 +
* Tuesday: synchronous (live) classes on Big Blue Button at 11:40 am - see learn.senecacollege.ca ("Blackboard") for details.
 +
* Friday: these classes will usually be asynchronous (pre-recorded) - see this page for details each week.
 +
 
 +
==== Course Setup ====
 +
# Generate a pair of [[SPO600_Servers#Preparatory_Steps|keys]] for [[SSH]] so that I can give you access to the [[SPO600 Servers]].
 +
# Set up a blog somewhere
 +
# Fill in this form to communicate the location of your blog and your SSH public key.
 +
 
 +
Based on the information submitted on the form, I will:
 +
# Update the [[SPO600 Participants Page]] with your blog location, and
 +
# 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 ====
 +
* Do the [[SPO600 Code Review Lab|Code Review Lab (Lab 1)]] as homework.
 +
 
 +
=== Week 1 Deliverables ===
 +
# Follow the course setup steps above (create a blog, create a pair of SSH keys, and send me the blog location and public key via the form).
 +
# Optional (strongly recommended): [[SPO600 Host Setup|Set up a personal Linux system]].
 +
# Optional: Purchase an AArch64 development board (such as a Raspberry Pi 4, Raspberry Pi 400, or [http://96boards.org 96Boards] device. (Note: install a 64-bit Linux operating system on it, not a 32-bit version).
 +
# Start work on [[SPO600 Code Review Lab|Lab 1]]. Blog your work.

Revision as of 18:08, 10 January 2022

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

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

This is a summary/index 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
Tuesday 11:40-1:30
Class II
Friday 9:50-11:40
Deliverables
(Summary - click for details)
1 Jan 10 Introduction to the Course / Introduction to the Problem / Computer Architecture Basics Binary Representation of Data Set up for the course / Lab 1
2 Jan 17 Introduction to 6502 Assembly Writing and Debugging 6502 Code / Assembly Language Conventions / Using Macros Effectively Lab 2
3 Jan 24 6502 Math / Jumps, Branches, and Subroutines 6502 Strings Lab 3
4 Jan 31 Introduction to 64-bit Assembly (x86_64 and AArch64) / Modern Architectural Enhancements Building Code / Make and Makefiles / Autotools and Friends Lab 4, January blog posts
5 Feb 07 More 64-bit Assemly Compiler Optimizations Lab 5
6 Feb 14 SIMD Inline Assembly Lab 6
7 Feb 21 Using ARMv9 instructions (for SVE2) on an ARMv8 system Project Selection Lab 7
Reading Oct 25 Reading Week February Blog Posts
8 Mar 07 Benchmarking and Profiling Project Stage 1 Project Stage 1
9 Mar 14 Memory System Design - Paging / Virtual Memory Project Discussion Blog about project work
10 Mar 21 Memory - Cache / NUMA Project Discussion Blog about project work
11 Mar 28 Memory - Observability, Barriers Project Stage 2 Project Stage 2, March Blog Posts
12 Apr 04 Atomic Operations Project Discussion Blog about project work
13 Apr 11 Project Discussion Good Friday Blog about project work
14 Apr 18 Future Directions in Architecture Project Stage 3 Project Stage 3, April Blog Posts

Week 1

Week 1 - Class I

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 for multiple architectures. However, there is a lot of existing code that contains some architecture-specific code fragments which contains assumptions based on the architecture written in architecture-specific high-level code or in Assembly Language.
  • 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 Langauge include:
    • Performance
    • Atomic Operations
    • Direct access to hardware features, e.g., CPUID registers
  • Most of the historical reasons for including 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 run as well 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.

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-proccessing, 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!

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").
  • Coursework is submitted by blogging.
  • 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. See your professor for details.
  • Course marks (see Weekly Schedule for dates):
    • 60% - Project Deliverables
    • 20% - Communication (Blog and Wiki writing)
    • 20% - Labs and Quizzes (10% labs - completed/not completed; 10% for quizzes - lowest 3 scores not counted)

Classes

  • Tuesday: synchronous (live) classes on Big Blue Button at 11:40 am - see learn.senecacollege.ca ("Blackboard") for details.
  • Friday: these classes will usually be asynchronous (pre-recorded) - see this page for details each week.

Course Setup

  1. Generate a pair of keys for SSH so that I can give you access to the SPO600 Servers.
  2. Set up a blog somewhere
  3. Fill in this form to communicate the location of your blog and your SSH public key.

Based on the information submitted on the form, I will:

  1. Update the SPO600 Participants Page with your blog location, 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 course setup steps above (create a blog, create a pair of SSH keys, and send me the blog location and public key via the form).
  2. Optional (strongly recommended): Set up a personal Linux system.
  3. Optional: Purchase an AArch64 development board (such as a Raspberry Pi 4, Raspberry Pi 400, or 96Boards device. (Note: install a 64-bit Linux operating system on it, not a 32-bit version).
  4. Start work on Lab 1. Blog your work.