linux模块builtin是什么意思,__builtin_prefetch(x)的资料

tty_open的操作中就有一个get_tty_driver函数就是根据设备号在tty_drivers链表中找到相应的设备驱动程序

而get_tty_driver调用list_for_each_entry(p, &tty_drivers, tty_drivers),这是一个宏,即

#define list_for_each_entry(pos, head, member)    \

for (pos = list_entry((head)->next, typeof(*pos), member); \

prefetch(pos->member.next), &pos->member != (head);  \

pos = list_entry(pos->member.next, typeof(*pos), member))

其实就是一个for语句。

而里面的prefetch(pos->member.next)也是一个宏

即:#define prefetch(x) __builtin_prefetch(x)

以下是__builtin_prefetch(x)的资料(可以与之前的unlikely,likely结合看):

另一种重要的性能改进方法是把必需的数据缓存在接近处理器的地方。缓存可以显著减少访问数据花费的时间。大多数现代处理器都有三类内存:

●一级缓存通常支持单周期访问

●二级缓存支持两周期访问

●系统内存支持更长的访问时间

为了尽可能减少访问延时并由此提高性能,最好把数据放在最近的内存中。手工执行这个任务称为预抓取。GCC 通过内置函数 __builtin_prefetch 支持数据的手工预抓取。在需要数据之前,使用这个函数把数据放到缓存中。如下所示,__builtin_prefetch 函数接收三个参数:

●addr   数据的地址

●rw 参数,使用它指明预抓取数据是为了执行读操作,还是执行写操作

●locality 参数,使用它指定在使用数据之后数据应该留在缓存中,还是应该清除

void __builtin_prefetch( const void *addr, int rw, int locality );

Linux 内核经常使用预抓取。通常是通过宏和包装器函数使用预抓取。清单 6 是一个辅助函数示例,它使用内置函数的包装器(见 ./linux/include/linux/prefetch.h)。这个函数为流操作实现预抓取机制。使用这个函数通常可以减少缓存缺失和停顿,从而提高性能。

清单 6. 范围预抓取的包装器函数

ifndef ARCH_HAS_PREFETCH

#define prefetch(x) __builtin_prefetch(x)

#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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值