The goal of this project is to add a functioning proof-of-concept prototype of Automatic Function Multi-Versioning (AFMV) capability to the Gnu Compiler Collection (GCC) for AArch64 systems, building on previous work.
1. Become familiar with the GCC build process. Build the current development version of GCC on AArch64 and x86 platforms. Get to know how long a full build takes, how to change the build options, and how to install a local (non-system, personal) copy of GCC.
2. Learn how to navigate the GCC codebase. Specifically, find out what code implements these aspects of the compiler and how to add to or change the code:
a. Find the code that controls the compilation passes, and how passes can be added.
b. Find the code that controls the argument parsing. Add a dummy argument and experiment with messages for the user that describe how and when that argument can be used.
c. Find out where argument information is stored and how it can be accessed in code.
d. Find out how dumps are produced during the compilation passes (in particular, during the tree passes). Become familiar with producing and reviewing these dumps. Create a dummy pass that produces a useful diagnostic dump.
Blog your results:
There are multiple versions of processors of every architecture currently in the market. You can see this when you go into a computer store such as Canada Computers or Best Buy – there are laptops and desktops with processors ranging from Atoms and Celerons to Ryzen 4/7/9 and Core i3/i5/i7/i9 processors, and workstations and servers with processors ranging up to Xeon and Epyc/Threadripper devices. Similarly, cellphones range from devices with Cortex-A35 cores through Neoverse X3 cores.
These wide range of devices support a diverse range of processor features.
Software developers (and vendors) are caught between supporting only the latest hardware, which limits the market they can sell to, or else harming the performance of their software by not taking advantage of recent processor improvements. Neither option is attractive for a software company wishing to be competitive.
To take good advantage of processor features with minimal effort by the software developers.
There are three solutions in various stages of preparation, each of which builds upon the previous solutions:
GCC IFUNC documenation:
Current documentation:
target_clones
syntax__HAVE_FEATURE_MULTI_VERSIONING
(or __FEATURE_FUNCTION_MULTI_VERSIONING
or __ARM_FEATURE_FUNCTION_MULTIVERSIONING
) does not appear to be definedImplementation in GCC
__attribue__((target("nnn")))
- where nnn
may take the form of “default”, or “feature” eg., “sse4.2”, or “feature,feature” e.g., “sse4.2,avx2”, or it may take the form “arch=archlevel” e.g., “arch=x86-64-v3” or “arch=atom”__attribute__((target_clone("nnn1", "nnn2" [...])))
__attribute__((target_version("nnn")))
- where nnn
may take the form of “default”, or “feature” e.g., “sve”, or “feature+feature” e.g., “sve+sve2” (Note: in some earlier versions of GCC, a plus-sign was required at the start of the feature list, e.g., “+sve” instead of “sve”. This was changed by gcc 14). Note the use of the attribute target_version
as opposed to target
(as used on x86) which is compliant with the ACLE specification. Note that the “arch=nnn” format is not supported (and probably should be).__attribute__((target_clone("nnn", "nnn" [...])))
- note that contrary to some of the documentation, there is no automatic “default” argument - the first argument supplied should be “default”See also the SPO600 2024 Summer Participants page.
# | Name | Description | Notes | Lead |
---|---|---|---|---|
1 | Command-line Parsing | Parse the GCC command line to pick up AFMV options, process the version list to validate the architectural feature specification | .opt file writing | Marco Siu |
2 | arch= Arguments | The current GCC AArch64 FMV capability accepts versions that are identified by feature flags (such as “sve2”) but does not accept “arch=” arguments such as “arch=armv9-a” (those type of arguments are accepted by the x86 FMV implementation). Add this functionality. | Connor Squires | |
3 | Apply FMV cloning to functions automatically | When the appropriate command-line options are provided, the compiler should automatically clone all functions, as if the target_clone attribute was specified. | Yukti Manoj Mulani | |
4 | Produce an error message if AFMV and FMV are used together | Produce an error if the compiler is invoked with AFMV command-line options and there are FMV attributes specified in the code. | Mara Perkons | |
5 | Prune Cloned Functions (1) | Remove any AFMV-created clone functions that do not provide any significant benefit or differentiation - Task 1: determine which function(s) to prune. | Sangwoo Shin | |
6 | Prune Cloned Functions (2) | Remove any AFMV-created clone functions that do not provide any significant benefit or differentiation - Perform function pruning. | Wai Hing William Tse | |
7 | Diagnostic Output | Provide diagnostic output (when activated by -fdump-…-… command-line options). | Anatolii Hryhorzhevskyi | |
8 | Git Wrangler | Mangage the repository. | This task includes rebasing as upstream changes and managing code reviews. | Rigels Hasani |
9 | Update Documentation 1 | Update the existing GCC IFUNC and FMV documentation (all archs) | Technical writing. | Shubh Jani |
10 | Create AFMV Documentation | Create documentation for the AFMV feature. | Technical writing. | Humaira Shaikh |
11 | Create Tests | Create a suite of tests for the AFMV capability. (This is in addition to individual tests that the various task owners will prepare). | Requires understanding the existing test framework and writing tests. | Zijun Li |
12 | Test AFMV Implementation | Use the existing test suite(s) to verify that the aarch64 changes are not introducing regressions on aarch64 or x86-64. | Requires understanding and using the existing test framework; may involve scripting. |
Make as much progress on the task identified above as possible! The goal is to have a proof-of-concept implemention.
Isolate your task from the other tasks. For example, if your code depends on command-line arguments, do not wait for the argument parsing task to be completed - instead, you can hard-code some assumed command-line arguments for testing purposes. We'll connect the various tasks together in the next Stage of the project.
Be sure to commit & push your code into a branch of the class GitHub repository.
Follow the GCC project's coding standards and practices.
If you are outputting information to the user (such as warnings or error messages), here is some additional information which may be useful:
Throughout the GCC code, you will see strings wrapped with a function named with an underscore, like this: _(“message”)
. For example, line 3730 of gcc/gcc.cc
:
printf (_("Usage: %s [options] file...\n"), progname);
Or line 2004 of gcc/opts.cc
:
description = _("The following options are target specific");
This unusual syntax is part of the gettext framework, which is a core part of the internationalization (i18n) code in GCC, which is the infrastructure which enables localization (l10n) – the ability to localize the software for use with varying languages (message text, language direction) and formats for numbers, dates, times, and currencies.
For more information, see the documentation for gettext.
However, it is sufficient in most cases to simply ensure that every string literal is wrapped in the underscore function; the i18n tools will take care of most of the rest.
For advice on writing good messages (diagnostics, warnings, errors), see the User Experience Guidelines chapter of the GCC Internals documentation.
The previous semester made some preliminary progress on some of these tasks. You can find the blog posts and the GitHub commits via these resources:
Blog your results:
Wrap up your project:
The goal is to get a working proof-of-concept of the GCC AFMV feature; please keep this in mind as you prioritize your work!
This is a summary of the discussion that took place in the June 17th class regarding status and next steps for each task:
# | Name | Lead | Status | Consumer (tasks we get data from) | Provider (tasks we give data to) | Affects (tasks affected) | Next Steps - Development | Next Steps - Connecting Code / Integrating | Description |
---|---|---|---|---|---|---|---|---|---|
1 | Command-line Parsing | Marco Siu | Working for 4 values (sve, sve2, simd, neon) | 3, 4, 7?, 11 | 10 | Validate all target_clone options | Feed values to 3,4,7?,11 - Initializes afmv_targets array and afmv_cnt? | Parse the GCC command line to pick up AFMV options, process the version list to validate the architectural feature specification | |
2 | arch= Arguments | Connor Squires | Picking up the values but not validating | 1, 10 | Get working target_clone | The current GCC AArch64 FMV capability accepts versions that are identified by feature flags (such as “sve2”) but does not accept “arch=” arguments such as “arch=armv9-a” (those type of arguments are accepted by the x86 FMV implementation). Add this functionality. | |||
3 | Apply FMV cloning to functions automatically | Yukti Manoj Mulani | Throwing error msgs re target value | 1 | 5 | Resolve error msgs | Accept data from 1 | When the appropriate command-line options are provided, the compiler should automatically clone all functions, as if the target_clone attribute was specified. | |
4 | Error message: AFMV && FMV | Mara Perkons | Working with dummy afmv arg | 1 | Accept data from 1 | Produce an error if the compiler is invoked with AFMV command-line options and there are FMV attributes specified in the code. | |||
5 | Prune Cloned Functions (1) - detect | Sangwoo Shin | ??? | (1), (3) | 6 | Remove any AFMV-created clone functions that do not provide any significant benefit or differentiation - Task 1: determine which function(s) to prune. | |||
6 | Prune Cloned Functions (2) - perform prune | Wai Hing William Tse | Accepts array of function names & prunes, tests failed | 5 | 7 | Get tests passing | Remove any AFMV-created clone functions that do not provide any significant benefit or differentiation - Perform function pruning. | ||
7 | Diagnostic Output | Anatolii Hryhorzhevskyi | Not dumping | 6 | Get dumps working | Integrate into 6 | Provide diagnostic output (when activated by -fdump-…-… command-line options). | ||
8 | Git Wrangler | Rigels Hasani | 5 branches updated | Rebase | Merge | Mangage the repository. | |||
9 | Update Documentation 1 | Shubh Janis | ??? | -2 | (Complete) | Update the existing GCC IFUNC and FMV documentation (all archs) | |||
10 | Create AFMV Documentation | Humaira Shaikh | ??? | (*, 1, 2, 4, 7) | Update with code changes | Create documentation for the AFMV feature. | |||
11 | Create Tests | Zijun Li | ??? | 1, (2?), 4, (5/6?), 7) | Update with code changes | Create a suite of tests for the AFMV capability. (This is in addition to individual tests that the various task owners will prepare). | |||
12 | Test AFMV Implementation | Use the existing test suite(s) to verify that the aarch64 changes are not introducing regressions on aarch64 or x86-64. |