4 ms·
> I can't read C# Not much different than C++... > Do you generate the sorting network at compile time No, except for power of two sizes up to 32. I experime
by zvrba 5y ago
> I can't read C#
Not much different than C++...
> Do you generate the sorting network at compile time
No, except for power of two sizes up to 32. I experimented with run-time code generation (and compilation) for given sizes, but... the generated machine code has too long prologue and epilogue for that to be worth-while (though the sorting code itself is well optimized, as if directly compiled from source). That's also mentioned in "Benchmarks" section.
> What's your sorting network template?
See References.
> And probably related: how is vectorization used?
See the code. There's no template, the code is fully "dynamic" and adapts itself to array size. As for vectorization... it compares/swaps 8 ints/floats at once, with some swizzles to rearrange the elements. For sizes that are not power of 2, I use masked loads and stores and some extra logic for deciding which comparisons to skip. (I treat non-existing elements "as if" they were set to intmax or float infinity.)
This file https://github.com/zvrba/SortingNetworks/blob/master/SortingNetworks/IntSorter.cs https://github.com/zvrba/SortingNetworks/blob/master/Sorting... has it all.
> this week-end project
Sorry, can't read Rust. (Though it reminds me of days spent coding in Perl.) Most networks are not SIMD-friendly (i.e., they'd need a lot of swizzling to exploit any parallelism) and the code as it's now is the 3rd iteration where I figured out how to best leverage SIMD to exploit the recursiveness and regularity in the network. (Not the least, no random memory accesses: only forward and backward loads and stores.)
Without SIMD, I don't think it'll be worth it, because network will also access the memory randomly (just as "standard" sort), and in addition it has worse algorithmic complexity.