Re: [PATCH v3 3/3] string: vectorize strspn single-accept-char case
Wilco Dijkstra <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Message-ID | <PAWPR08MB89828BCED8961D726F54C49383A72@PAWPR08MB8982.eurprd08.prod.outlook.com> |
Hi Matt, > The single-accept-character fast path was a byte-at-a-time scalar loop. > Scan a word at a time instead, using find_ne_all () to locate the first > byte that differs from the broadcast accept character. ACCEPT[0] is not > NUL here, so a NUL byte differs from it and the search for inequality > also stops at the end of the string. > > The word loop compares against the broadcast character directly rather > than building a mask each iteration, and calls find_ne_all () once at the > end. Where find_ne_all () is an exclusive or the compiler already > generated this, but alpha builds the mask with cmpbge, and the comparison > halves its loop. > > The multi-character case keeps the existing bitmap-table scan. > > Checked against strspn () for lengths 0 to 300 at every byte alignment, > for several accept characters, with the run ended both by NUL and by a > differing byte. Run on alpha (EV68CB), powerpc64 big-endian, 32-bit arm, > aarch64 and x86_64, covering the cmpbge, cmpb, uqsub8 and generic C > string-fza.h implementations. The riscv ones were built but not run. > > Speedup over the scalar loop it replaces: > > length 8 32 128 512 2K 8K 32K > Alpha EV68 1.3x 3.3x 5.2x 11.7x 15.2x 16.4x 16.9x > i7-1370P 1.9x 2.8x 5.5x 4.0x 5.2x 6.9x 7.6x > > Both are the best of seven timed runs of each implementation, each run > calibrated to at least 0.3 s so that the millisecond clock granularity on > alpha does not quantize the result, and built with -falign-functions=64 > so that code placement does not dominate the short lengths. The i7-1370P > reaches this code only where SSE4.2 is unavailable, since the generic C > string-fza.h is what it would use there. > > Suggested-by: Wilco Dijkstra <[email protected]> LGTM. I double checked AArch64: it is equally fast at len 1, 2.6x faster at size 8 and 4.5x at len 32. Reviewed-by: Wilco Dijkstra <[email protected]> Cheers, Wilco