Friday, September 16, 2011

Cacheline prefetch

_mm_prefetch是一条SSE的指令.用于指导CPU如何去预取内存中的数据. 具体在C/C++代码里, 先需要#include <xmmintrin.h> 可以使用:

void _mm_prefetch(char * p , int i );
p为要预取数据的内存地址, i可以为_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, 或者 _MM_HINT_NTA中的一个. 他们的区别为:
  • PREFETCHT0 (T0): prefetch数据到所有级别cache, 包括L0 cache
  • PREFETCHT1 (T1): prefetch数据到所有级别cache, 但是除去L0 cache
  • PREFETCHT2 (T2): prefetch数据到所有级别cache, 但是除去L0和L1 cache
  • PREFETCHNTA: 将给定内存地址的数据prefetch到L2 cache的某个特定column上,这样如果这个内存地址的数据只是一次性的使用,就不会导致其他有用的cacheline被替换出cache. 好处是可以可以防止non-temporal 数据污染cache

Wednesday, September 14, 2011

static关键字在C/C++中的N种用法

static是C/C++中最让人抓狂的关键字,因为这个关键字被重载了太多不同的用法.要我说这就是C/C++这些语言设计崩坏的地方.

用法1:
在C中,如果用static修饰一个函数或者全局变量,那么这个函数或者变量仅仅为这个module中其他函数所见.所谓module就是这个C源文件的意思.这种用法实际上相当于Java或者C++中用private去修饰一个成员变量.这种用法下尽可能的使用static被认为是C程序员的良好习惯 -- C从设计上就对namespace问题苦手.

用法2:
在C++中,被static修饰的成员函数被称为静态成员函数.这种静态成员函数可以被"类名::函数名"来调用.

用法3:
C/C++中, 一个局部变量的声明如果被static修饰,那么该变量实际上不在运行栈上随着函数的调用和返回生灭,而是有一个全局的备份.换言之,这个变量类似于一个全局变量.