On Thu, 24 Oct 2024 at 15:00, Mateusz Guzik via Gcc <gcc@gcc.gnu.org> wrote:

> I understand the stock behavior of pilling variables on may happen to
> improve cache usage.
>
> However, in a multicore setting it is a never-ending source of
> unintentionally showing up and disappearing false-sharing depending on
> unrelated variables being added or removed.
>
> I'm aware one can manually add padding or explicitly tell the linker
> to put a specific variable elsewhere, but in large codebases getting
> to a point where everything is annotated is quite a challenge. To give
> you one example of a project which did not get there despite literally
> decades of multicore development: the Linux kernel (or in fact any
> open-source kernel out there, last I checked).
>
> In the meantime a great clutch would contain such problems to a
> specific .o file.
>
> To illustrate, suppose there are 3 .o files with variables spanning 2
> cache lines. The first .o file has something frequently read and it
> lands in the first cache line. At the same time the last .o file has a
> frequently modified var and it currently lands in the second cache
> line.
>
> Now some vars got removed from the "middle" .o file and as a result
> the frequently modified var is pulled up to the first cache line,
> false-sharing with a frequently read var from something unrelated.
>
> This results in a slowdown stemming from a change which should have no
> impact.
>
> I once more note ideally this all would be annotated in
> project-specific ways, but so far even Linux did not get there despite
> playing whack-a-mole.
>
> An option to keep variables from different .o files in separate lines
> would be a great damage-controlling measure.
>
> I'll note even on CPUs with 64 byte cache lines one may want to pick a
> higher value (e.g., due to the adjacent cache line prefetcher on Intel
> CPUs). Thus the best option would probably accept an argument
> specifying how much alignment one expects.
>
> For illustrative purposes, I don't care about the name:
> -align-object-data-section=64
>
> Thoughts?
>

Wouldn't that be a linker option, and so not part of GCC?

Reply via email to