About Optimizing - 0001

在优化memcpy之前,还需要先了解一下和缓存预取有关的资料:

缓存预取相关指令:

| 操作码 | 指令 | 功用
| 0F 18 /1 | PREFETCHT0 m8 | 预取数据到所有级别的缓存,包括L0。 |
| 0F 18 /2 | PREFETCHT1 m8 | 预取数据到除L0外所有级别的缓存。 |
| 0F 18 /3 | PREFETCHT2 m8 | 预取数据到除L0和L1外所有级别的缓存。 |
| 0F 18 /0 | PREFETCHNTA m8 | 预取数据到非临时缓冲结构中,可以最小化对缓存的污染。 |

Intel® C++ Compiler的Intrinsic等效方法:

void _mm_prefetch(char *p, int i)

从地址P处预取尺寸为cache line大小的数据缓存,参数i指示预取方式(_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA,分别表示不同的预取方式)

遐想一下,如果在CPU操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝,理论上应该能够提高性能,看来值得一试。


注意


CPU对数据操作拥有绝对自由!使用预取指令只是按我们自己的想法对CPU的数据操作进行补充,有可能CPU当前并不需要我们加载到缓存的数据。如果遇到这种情况,我们的预取指令可能会带来相反的结果,比如对于多任务系统,有可能我们的干预正好冲掉了有用的缓存,帮了倒忙。不过,在多任务系统上,由于线程或进程的切换所花费的时间相对于预取操作来说太长了,简直好象一个世纪之久,所以可以忽略线程或进程切换对缓存预取的影响。

你可能感兴趣的:(c++,optimization)