Pawel K. Radtke, Cristian G. Barrera-Hinojosa, Mladen Ivkovic, Tobias Weinzierl
{"title":"An extension of C++ with memory-centric specifications for HPC to reduce memory footprints and streamline MPI development","authors":"Pawel K. Radtke, Cristian G. Barrera-Hinojosa, Mladen Ivkovic, Tobias Weinzierl","doi":"arxiv-2406.06095","DOIUrl":null,"url":null,"abstract":"The C++ programming language and its cousins lean towards a\nmemory-inefficient storage of structs: The compiler inserts helper bits into\nthe struct such that individual attributes align with bytes, and it adds\nadditional bytes aligning attributes with cache lines, while it is not able to\nexploit knowledge about the range of integers, enums or bitsets to bring the\nmemory footprint down. Furthermore, the language provides neither support for\ndata exchange via MPI nor for arbitrary floating-point precision formats. If\ndevelopers need to have a low memory footprint and MPI datatypes over structs\nwhich exchange only minimal data, they have to manipulate the data and to write\nMPI datatypes manually. We propose a C++ language extension based upon C++\nattributes through which developers can guide the compiler what memory\narrangements would be beneficial: Can multiple booleans be squeezed into one\nbit field, do floats hold fewer significant bits than in the IEEE standard, or\ndoes the code require a user-defined MPI datatype for certain subsets of\nattributes? The extension offers the opportunity to fall back to normal\nalignment and padding rules via plain C++ assignments, no dependencies upon\nexternal libraries are introduced, and the resulting code remains standard C++.\nOur work implements the language annotations within LLVM and demonstrates their\npotential impact, both upon the runtime and the memory footprint, through\nsmoothed particle hydrodynamics (SPH) benchmarks. They uncover the potential\ngains in terms of performance and development productivity.","PeriodicalId":501256,"journal":{"name":"arXiv - CS - Mathematical Software","volume":"233 1","pages":""},"PeriodicalIF":0.0000,"publicationDate":"2024-06-10","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":"0","resultStr":null,"platform":"Semanticscholar","paperid":null,"PeriodicalName":"arXiv - CS - Mathematical Software","FirstCategoryId":"1085","ListUrlMain":"https://doi.org/arxiv-2406.06095","RegionNum":0,"RegionCategory":null,"ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":null,"EPubDate":"","PubModel":"","JCR":"","JCRName":"","Score":null,"Total":0}
引用次数: 0
Abstract
The C++ programming language and its cousins lean towards a
memory-inefficient storage of structs: The compiler inserts helper bits into
the struct such that individual attributes align with bytes, and it adds
additional bytes aligning attributes with cache lines, while it is not able to
exploit knowledge about the range of integers, enums or bitsets to bring the
memory footprint down. Furthermore, the language provides neither support for
data exchange via MPI nor for arbitrary floating-point precision formats. If
developers need to have a low memory footprint and MPI datatypes over structs
which exchange only minimal data, they have to manipulate the data and to write
MPI datatypes manually. We propose a C++ language extension based upon C++
attributes through which developers can guide the compiler what memory
arrangements would be beneficial: Can multiple booleans be squeezed into one
bit field, do floats hold fewer significant bits than in the IEEE standard, or
does the code require a user-defined MPI datatype for certain subsets of
attributes? The extension offers the opportunity to fall back to normal
alignment and padding rules via plain C++ assignments, no dependencies upon
external libraries are introduced, and the resulting code remains standard C++.
Our work implements the language annotations within LLVM and demonstrates their
potential impact, both upon the runtime and the memory footprint, through
smoothed particle hydrodynamics (SPH) benchmarks. They uncover the potential
gains in terms of performance and development productivity.