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

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

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内核——入门篇