Re: Add prefetch switch stack hook in scheduler function

From: Peter Zijlstra
Date: Fri Jul 29 2005 - 04:19:13 EST



> ---------
> unroll prefetch_range() loops manually.
>
> Signed-off-by: Ingo Molnar <mingo@xxxxxxx>
>
> include/linux/prefetch.h | 31 +++++++++++++++++++++++++++++--
> 1 files changed, 29 insertions(+), 2 deletions(-)
>
> Index: linux/include/linux/prefetch.h
> ===================================================================
> --- linux.orig/include/linux/prefetch.h
> +++ linux/include/linux/prefetch.h
> @@ -58,11 +58,38 @@ static inline void prefetchw(const void
> static inline void prefetch_range(void *addr, size_t len)
> {
> #ifdef ARCH_HAS_PREFETCH
> - char *cp;
> + char *cp = addr;
> char *end = addr + len;
>
> - for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
> + /*
> + * Unroll agressively:
> + */
> + if (len <= PREFETCH_STRIDE)
> prefetch(cp);
> + else if (len <= 2*PREFETCH_STRIDE) {
> + prefetch(cp);
> + prefetch(cp + PREFETCH_STRIDE);
> + }
> + else if (len <= 3*PREFETCH_STRIDE) {
> + prefetch(cp);
> + prefetch(cp + PREFETCH_STRIDE);
> + prefetch(cp + 2*PREFETCH_STRIDE);
> + }
> + else if (len <= 4*PREFETCH_STRIDE) {
> + prefetch(cp);
> + prefetch(cp + PREFETCH_STRIDE);
> + prefetch(cp + 2*PREFETCH_STRIDE);
> + prefetch(cp + 3*PREFETCH_STRIDE);
> + }
> + else if (len <= 5*PREFETCH_STRIDE) {
> + prefetch(cp);
> + prefetch(cp + PREFETCH_STRIDE);
> + prefetch(cp + 2*PREFETCH_STRIDE);
> + prefetch(cp + 3*PREFETCH_STRIDE);
> + prefetch(cp + 4*PREFETCH_STRIDE);
> + } else
> + for (; cp < end; cp += PREFETCH_STRIDE)
> + prefetch(cp);
> #endif
> }
>

code like that always makes me think of duffs-device
http://www.lysator.liu.se/c/duffs-device.html

although it might be that the compiler generates better code from the
current incarnation; just my .02 ;-)

regards,

--
Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/