我是靠谱客的博主 明亮鸡翅,最近开发中收集的这篇文章主要介绍arm64的prefetch/prefetchw/spin_lock_prefetch,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

prefetch 用于手工执行预抓取,其是通过gcc内置的函数,arm64 则是自己通过汇编实现的,主要用于提升性能
prefetch定义在incude/linux/prefetch.h中
#ifndef ARCH_HAS_PREFETCH
#define prefetch(x) __builtin_prefetch(x)
#endif

#ifndef ARCH_HAS_PREFETCHW
#define prefetchw(x) __builtin_prefetch(x,1)
#endif

#ifndef ARCH_HAS_SPINLOCK_PREFETCH
#define spin_lock_prefetch(x) prefetchw(x)
#endif

#ifndef PREFETCH_STRIDE
#define PREFETCH_STRIDE (4*L1_CACHE_BYTES)
#endif

static inline void prefetch_range(void *addr, size_t len)
{
#ifdef ARCH_HAS_PREFETCH
    char *cp;
    char *end = addr + len;

    for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
        prefetch(cp);
#endif
}

#endif
prefetch 用于读预取
prefetchw 用于写预取
spin_lock_prefetch 用于spin lock的预取
前面三个都是单个变量的预取,而prefetch_range 用于一定范围的预取。
在arm64 实现在kernel/sched/core.c 中则是通过汇编指令实现的,没有用gcc中的默认实现
 * Prefetching support
 */
#define ARCH_HAS_PREFETCH
static inline void prefetch(const void *ptr)
{
    asm volatile("prfm pldl1keep, %a0n" : : "p" (ptr));
}

#define ARCH_HAS_PREFETCHW
static inline void prefetchw(const void *ptr)
{
    asm volatile("prfm pstl1keep, %a0n" : : "p" (ptr));
}

#define ARCH_HAS_SPINLOCK_PREFETCH
static inline void spin_lock_prefetch(const void *ptr)
{
    asm volatile(ARM64_LSE_ATOMIC_INSN(
             "prfm pstl1strm, %a0",
             "nop") : : "p" (ptr));
}

最后

以上就是明亮鸡翅为你收集整理的arm64的prefetch/prefetchw/spin_lock_prefetch的全部内容,希望文章能够帮你解决arm64的prefetch/prefetchw/spin_lock_prefetch所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部