Kääntäjäoptimointi ja C++20 [[likely]]- ja [[unlikely]]-attribuutit
Kumpulainen, Henri (2021)
Kumpulainen, Henri
2021
All rights reserved. This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:amk-2021111920658
https://urn.fi/URN:NBN:fi:amk-2021111920658
Tiivistelmä
Tässä työssä tutustuttiin C++20-standardin [[likely]]- ja [[unlikely]]-kääntäjäattribuutteihin ja niiden suorituskykyvaikutuksiin sekä niihin liittyviin teoria-aiheisiin, kuten kääntäjäoptimointiin ja C++:aan. C++:aa ohjelmointikielenä käsiteltiin selvittäen lyhyesti sen ominaisuuksia, vahvuuksia ja historiaa. Myös erityisesti C++20-standardin sisältöä ja kielen soveltuvuutta optimointiin tarkasteltiin.
Työssä käsiteltiin optimoinnin perusteita yleisistä käsitteistä ja periaatteista lähtien niin ohjelmakoodin itsensä optimoinnin kuin erityisesti kääntäjäoptimoinnin olennaisten tekniikoiden osalta. Prosessorien haarautumisen ennakoinnin historiaan ja eri tekniikoihin perehdyttiin. Kääntäjäoptimoinnin ja haarautumisen ennakoinnin kohdalla työssä selvitettiin myös, miten [[likely]]- ja [[unlikely]]-attribuutit hyödyntävät näitä ominaisuuksia esimerkiksi ohjelmakoodin järjestystä muuttamalla.
Opinnäytetyössä tutustuttiin attribuutteihin lähtien aiemmista verrokeista ja taustalla olevista ominaisuuksista, kuten builtin_expect. Attribuuttien toimintaan tutustuttiin käytännössä GCC:tä käyttäen todentaen samalla teoriaosuuksissa ilmaistuja liitoksia taustalla oleviin tekniikoihin.
Työssä tehtiin mittauksia attribuuttien suorituskykyvaikutuksista käyttäen yksinkertaista automatisoitua kehystä, jolla muutoksien ja lisäyksien tekeminen on yksinkertaista. Mittauksia tehtiin neljä, joissa verrattiin kolmea eri ohjelmaa: ilman attribuutteja ja attribuutit molemmin eri päin. Kahdessa mittauksista käytössä oli lisäksi ehtolauseiden todennäköisyyden muuttamista eri tasoille, joista jokaisella tehtiin samat mittaukset.
Tuloksista huomattiin, että attribuuteilla on mahdollista saada huomattaviakin vaikutuksia, mutta suurimassa osassa testeistä muutoksia ei ole havaittavissa. Syy tuloksille – ja niiden eroavaisuuksille verrokkituloksiin kuten standardiehdotukseen verrattuna – analysoitiin löytyvän todennäköisesti prosessorien ja kääntäjien kehityksestä ja/tai eroista. Attribuuteista todettiin, että käyttö voi tarjota mahdollisuuksia joissakin tilanteissa, mutta olennaiseksi osaksi C++-optimointia niistä ei liene. This work scrutinizes the C++20-standard [[likely]] and [[unlikely]] compiler attributes and their performance effects, as well as related theory topics, such as compiler optimization and C++. C++ as a programming language, its features, strengths and history was researched. Contents of the C++20-standard and aptitude of C++ for optimization were covered.
Fundamentals of optimization were explored, both regarding optimization of the code itself and especially the essential techniques of compiler optimization. History and different types of processor branch prediction were analyzed. How [[likely]] and [[unlikely]] flags utilize features of compiler optimization and branch prediction was also examined.
The attributes themselves were inspected, starting from earlier similar features like builtin_expect. The functionality of the attributes was examined using GCC, confirming some of the connections suggested earlier when covering the related techniques.
Measurements on the performance effects of the attributes were executed, using simple automatized framework which makes changes and additions to the tests straightforward. Four measurements were carried out, with each one of them comparing three programs: one with no attributes, and one each for the two ways to use the attributes in each case. Additionally, two of the measurements had changes in the branch probability level, with each level going through the same three tests.
The results indicated that it was possible to achieve noticeable effects – both positive and negative – with the attributes. In most cases, however, there were no changes. The reason for these results – and their difference compared to the respective results elsewhere, such as the standard proposal – was deemed to likely stem from advancements and/or changes in processor and compiler architecture. The verdict was that the attributes may offer possibilities in some situations, but it is unlikely that they will be important features in optimization of C++.
Työssä käsiteltiin optimoinnin perusteita yleisistä käsitteistä ja periaatteista lähtien niin ohjelmakoodin itsensä optimoinnin kuin erityisesti kääntäjäoptimoinnin olennaisten tekniikoiden osalta. Prosessorien haarautumisen ennakoinnin historiaan ja eri tekniikoihin perehdyttiin. Kääntäjäoptimoinnin ja haarautumisen ennakoinnin kohdalla työssä selvitettiin myös, miten [[likely]]- ja [[unlikely]]-attribuutit hyödyntävät näitä ominaisuuksia esimerkiksi ohjelmakoodin järjestystä muuttamalla.
Opinnäytetyössä tutustuttiin attribuutteihin lähtien aiemmista verrokeista ja taustalla olevista ominaisuuksista, kuten builtin_expect. Attribuuttien toimintaan tutustuttiin käytännössä GCC:tä käyttäen todentaen samalla teoriaosuuksissa ilmaistuja liitoksia taustalla oleviin tekniikoihin.
Työssä tehtiin mittauksia attribuuttien suorituskykyvaikutuksista käyttäen yksinkertaista automatisoitua kehystä, jolla muutoksien ja lisäyksien tekeminen on yksinkertaista. Mittauksia tehtiin neljä, joissa verrattiin kolmea eri ohjelmaa: ilman attribuutteja ja attribuutit molemmin eri päin. Kahdessa mittauksista käytössä oli lisäksi ehtolauseiden todennäköisyyden muuttamista eri tasoille, joista jokaisella tehtiin samat mittaukset.
Tuloksista huomattiin, että attribuuteilla on mahdollista saada huomattaviakin vaikutuksia, mutta suurimassa osassa testeistä muutoksia ei ole havaittavissa. Syy tuloksille – ja niiden eroavaisuuksille verrokkituloksiin kuten standardiehdotukseen verrattuna – analysoitiin löytyvän todennäköisesti prosessorien ja kääntäjien kehityksestä ja/tai eroista. Attribuuteista todettiin, että käyttö voi tarjota mahdollisuuksia joissakin tilanteissa, mutta olennaiseksi osaksi C++-optimointia niistä ei liene.
Fundamentals of optimization were explored, both regarding optimization of the code itself and especially the essential techniques of compiler optimization. History and different types of processor branch prediction were analyzed. How [[likely]] and [[unlikely]] flags utilize features of compiler optimization and branch prediction was also examined.
The attributes themselves were inspected, starting from earlier similar features like builtin_expect. The functionality of the attributes was examined using GCC, confirming some of the connections suggested earlier when covering the related techniques.
Measurements on the performance effects of the attributes were executed, using simple automatized framework which makes changes and additions to the tests straightforward. Four measurements were carried out, with each one of them comparing three programs: one with no attributes, and one each for the two ways to use the attributes in each case. Additionally, two of the measurements had changes in the branch probability level, with each level going through the same three tests.
The results indicated that it was possible to achieve noticeable effects – both positive and negative – with the attributes. In most cases, however, there were no changes. The reason for these results – and their difference compared to the respective results elsewhere, such as the standard proposal – was deemed to likely stem from advancements and/or changes in processor and compiler architecture. The verdict was that the attributes may offer possibilities in some situations, but it is unlikely that they will be important features in optimization of C++.