arm64的prefetch/prefetchw/spin_lock_prefetch
来源:互联网 发布:大数据时代 txt 久久 编辑:程序博客网 时间:2024/06/13 22:40
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, %a0\n" : : "p" (ptr));
}
#define ARCH_HAS_PREFETCHW
static inline void prefetchw(const void *ptr)
{
asm volatile("prfm pstl1keep, %a0\n" : : "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));
}
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, %a0\n" : : "p" (ptr));
}
#define ARCH_HAS_PREFETCHW
static inline void prefetchw(const void *ptr)
{
asm volatile("prfm pstl1keep, %a0\n" : : "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));
}
0 0
- arm64的prefetch/prefetchw/spin_lock_prefetch
- prefetch
- prefetch
- 有关DDR MEMORY 的prefetch
- arm64相关的问题
- arm64的一种错误
- ARM64 Linux的启动分析
- arm64 memory node的解析
- ARM64的__create_page_tables代码走读
- ARM64 Linux的启动分析
- 有关Cache –(1) linux list之中的Prefetch
- PREFETCH文件夹
- prefetch abort
- 认识prefetch
- auto&prefetch
- dns-prefetch
- DNS Prefetch
- HTML5 prefetch
- 移动端如何让页面强制横屏
- 4-4 求自定类型元素的平均 (10分)
- 在R语言中进行局部多项式回归拟合(LOESS)
- s5pv210——SD卡启动的细节思考
- sass 学习笔记(一):嵌套,变量,operation。。。基本就是翻译了一遍官网
- arm64的prefetch/prefetchw/spin_lock_prefetch
- Java中File 类的使用
- 判断APP是否运行在前台
- MPAndroidChart详解
- SecureCRT中文显示乱码问题解决
- 市医院深入开展出院随访工作案例
- Redis实用指令(三)——List
- Vue初学时一些该注意的细节
- (三)数据链路--图解TCP/IP读书笔记