5 ms·
Compilers can’t really, in a meaningful way, change the layout of your data in memory. And you do need to think about your memory layout to get any benefit from
by cmovq 3mo ago
Compilers can’t really, in a meaningful way, change the layout of your data in memory. And you do need to think about your memory layout to get any benefit from SIMD. You’ll notice a lot of compiler auto vectorization insert many instructions just to shuffle data around to get to a usable layout, which negates much of the benefit.
- fulafel 3mo agoDepends on the programming language. A good question is why we don't have more optimizable languages in mainstream use.
- flohofwoe 3mo agoAre there any programming languages which change the data layout beyond naively sorting struct members by alignment? (which at best helps with reducing padding bytes but can be either good or bad for performance, depending on the code which accesses the data).
- londons_explore 3mo agoOne simple optimization is to change arrays of struts into struts of arrays. To my knowledge, nothing even makes those changes, despite them being safe and having a huge potential performance benefit.
- flohofwoe 3mo agoNow that you mention it... :) Zig has MultiArrayList in the stdlib which does the SoA transform via comptime: https://ziglang.org/documentation/master/std/#std.multi_array_list.MultiArrayList https://ziglang.org/documentation/master/std/#std.multi_arra... Zig also sorts struct members by size/alignment, but has two escape hatches ('extern struct' which is for C compatibility, and 'packed struct' which offers an explicit bit-by-bit memory layout). AFAIK Odin and Jai offer the SoA transform as specialized language features, e.g. in Odin: https://odin-lang.org/docs/overview/#soa-data-types https://odin-lang.org/docs/overview/#soa-data-types I'd still always want such data layout transforms as an explicit language feature though, not the compiler making this decision for me.
- pillmillipedes 3mo agovarious SQLs and APLs come to mind :) the industry still has a lot to learn from them both
- fulafel 3mo agoHalide comes to mind (though it a DSL and not a full independent language). I wonder if Futhark does? Eg https://futhark-lang.org/student-projects/pedersen-nelin-msc-thesis.pdf https://futhark-lang.org/student-projects/pedersen-nelin-msc...
- inigyou 3mo agoFORTRAN is used for a lot of numerical algorithms - today! installed on your computer right now in some library! - because it optimizes better than C because it doesn't have pointers.
- fc417fc802 3mo agoAs I understand it most of the difference can be made up by adding the restrict qualifier to everything in C.
- motoboi 3mo agoThis is actually a very nice question and the answer is that interpreted languages with a JIT benefit from this. One example is Java, which will happily vectorize your code into AVX or SSE where possible. Python just got a JIT compiler and we’ll start seeing the same thing soon. But as someone else said here, some constructs don’t translate well and adding transformations to show vectorization would negate the perfomance gains. Sad that the compiler (even Java) can’t explain you this and warn about it, but now with LLM, maybe they’ll start doing things like that soon.
- ignoreusernames 3mo agoEven when the layout is friendly to simd, auto vectorization can be finicky. As a programmer, it’s really annoying to be constantly inspecting compiler output to see if the code was properly vectorized. Even if it was, slight changes or compiler updates can throw the whole thing off. Auto vectorization is nice when you get performance improvements for “free”, but I find it fragile for the really critical parts where you absolutely need it to be vectorized. I often wonder about a macro-like thing where we could write a function using a subset of the language that’s simd aware. A bit higher level than using intrinsics or those simd libs
- VonTum 3mo agoI believe the "Odin" language has this simd-awareness built-in.