/*
* Allow CFLAGS to override the configured / deduced cache line size
*/
#ifndef CLIB_LOG2_CACHE_LINE_BYTES
/* Default cache line size of 64 bytes. */
#ifndef CLIB_LOG2_CACHE_LINE_BYTES
#define CLIB_LOG2_CACHE_LINE_BYTES 6
#endif
#endif /* CLIB_LOG2_CACHE_LINE_BYTES defined */
#if (CLIB_LOG2_CACHE_LINE_BYTES >= 9)
#error Cache line size 512 bytes or greater
#endif
#define CLIB_CACHE_LINE_BYTES (1 << CLIB_LOG2_CACHE_LINE_BYTES)
#define CLIB_CACHE_LINE_ALIGN_MARK(mark) u8 mark[0] __attribute__((aligned(CLIB_CACHE_LINE_BYTES)))
在编译器没有指定cache line大小的情况下,我们将它指定成64字节。不允许编译器指定的cache line超过256字节。
cache line bytes指的是一次性从内存读入到CPU缓存中的字节数目。CPU访问自己内部的缓存比访问内存的效率高得多。
cache line对齐的目的是,减少cache失效的次数,避免无畏的性能降低。
/* Default cache line fill buffers. */
#ifndef CLIB_N_PREFETCHES
#define CLIB_N_PREFETCHES 16
#endif
/* Read/write arguments to __builtin_prefetch. */
#define CLIB_PREFETCH_READ 0
#define CLIB_PREFETCH_LOAD 0 /* alias for read */
#define CLIB_PREFETCH_WRITE 1
#define CLIB_PREFETCH_STORE 1 /* alias for write */
#define _CLIB_PREFETCH(n,size,type) \
if ((size) > (n)*CLIB_CACHE_LINE_BYTES) \
__builtin_prefetch (_addr + (n)*CLIB_CACHE_LINE_BYTES, \
CLIB_PREFETCH_##type, \
/* locality */ 3);
#define CLIB_PREFETCH(addr,size,type) \
do { \
void * _addr = (addr); \
\
ASSERT ((size) <= 4*CLIB_CACHE_LINE_BYTES); \
_CLIB_PREFETCH (0, size, type); \
_CLIB_PREFETCH (1, size, type); \
_CLIB_PREFETCH (2, size, type); \
_CLIB_PREFETCH (3, size, type); \
} while (0)
#undef _
对指定的内存块,进行预先读取,或者预先写入。提升效率。