Content #
__builtin_prefetch(const void *addr, int rw, int locality)
主动进行数据预取,在使用地址addr的值之前就把其值加载到cache中,减少读取的延迟,从而提高性能。
- addr表示要预取数据的地址;
- rw表示读写属性,1表示可写,0表示只读;
- locality表示数据在cache中的时间局部性。其中0表示读取完addr的之后不用保留在cache中,而1~3表示时间局部性逐渐增强。
如下面的prefetch()和prefetchw()函数的实现。
//<include/linux/prefetch.h>
#define prefetch(x) __builtin_prefetch(x)
#define prefetchw(x) __builtin_prefetch(x,1)
下面是使用prefetch()函数进行优化的一个例子。
//<mm/page_alloc.c>
void __init __free_pages_bootmem(struct page *page, unsigned int order)
{
unsigned int nr_pages = 1 << order;
struct page *p = page;
unsigned int loop;
prefetchw(p);
for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
prefetchw(p + 1);
__ClearPageReserved(p);
set_page_count(p, 0);
}
…
}
在处理struct page数据之前通过prefetchw()预取到cache中,从而提升性能。
From #
奔跑吧Linux内核——入门篇