News for hackers. Stuff that matters.
Re:A 100LOC C impl of memset, that is faster than glibc's by jmull on Friday November 12, 2021 @07:47AM (#29198771)
I’m wonder how well this handles unaligned memory?

That used to be stable stakes for this kind of thing, but maybe it doesn’t matter much anymore?

Re:A 100LOC C impl of memset, that is faster than glibc's by kevin_b_er on Friday November 12, 2021 @02:38PM (#29203644)
Probably poorly. It is a violation to cast an unaligned pointer to an aligned type that the base pointer is not aligned for. And the code looks like it does just that right here: https://github.com/nadavrot/memset_benchmark/blob/main/src/l...

This is undefined behavior under C99 §6.3.2.3 Paragraph 7. "If the resulting pointer is not correctly aligned for the pointed-to type, the behavior is undefined."

The musl code referenced has handling for this.

Re:A 100LOC C impl of memset, that is faster than glibc's by mananaysiempre on Friday November 12, 2021 @08:38AM (#29199120)
On the x86, in the P4 times the best performing bulk operations essentially required using SIMD, and that SIMD hated you unless you aligned your memory accesses. The result was horrible bloated code to handle leading and trailing data and thus also a need to split off the implementations for small sizes. The unaligned access penalty is much lower now, and REP-prefixed operations have microcoded implementations that use the maximum memory access width (which you can’t do otherwise without SIMD instructions).

I’m curious about what the referenced code compiles down to, actually, because not only could GCC be auto-vectorizing it, it could be replacing it with a REP STOSQ or indeed a call to memset.

Re:A 100LOC C impl of memset, that is faster than glibc's by ninkendo on Friday November 12, 2021 @09:02AM (#29199315)
Here's the code in godbolt:

gcc: https://godbolt.org/z/6xG5dKjj9

clang: https://godbolt.org/z/Mh9zozjvK

I'm no asm expert, but it doesn't look like a lot of vector instructions in the gcc compilation of this, while the clang compilation seems to have more calls with the 128-bit xmm registers (at least on x86_64.) You can also just see visibly how many more instructions the gcc version outputs.

Re:A 100LOC C impl of memset, that is faster than glibc's by mananaysiempre on Friday November 12, 2021 @09:13AM (#29199399)
Thank you! Indeed GCC does not use SIMD here unless you set -O3 (... I seem to remember this enables some vectorization?) or allow it to use AVX with -mavx or -march=x86-64-v3. For some reason I’m unable to get it to use plain SSE (always available on x86-64) with any -mtune setting or even with -march=x86-64-v2.