我正在编写一个解析文件的程序.它由一个主循环组成,逐个字符地解析并处理它们.这是主循环:
char c; char * ptr; for( size_t i = 0; i < size ; ++i ) { ptr = ( static_cast<char*>(sentenceMap) + i ); c = *ptr; __builtin_prefetch( ptr + i + 1 ); // some treatment on ptr and c }
如您所见,我添加了一条builtin_prefetch指令,希望在我的循环的下一次迭代中放入缓存.我尝试了不同的值:ptr i 1,ptr i 2,ptr i 10但似乎没有任何改变.
为了测量性能,我使用valgrind的工具cachegrind,它给出了缓存未命中数的指示.在行c = * ptr上,当未设置__builtin_prefetch时,cachegrind记录632,378 DLmr(L3缓存未命中).但奇怪的是,无论我设置为__builtin_prefetch的参数如何,此值都不会更改.
对此有何解释?
解决方法
那是因为硬件比您早多年.