高级编程主题:数据预取与非临时内存存储
1. 数据预取概述
数据预取是一种可以提升特定算法性能的技术。应用程序能够使用预取指令(Prefetch Data Into Caches),将预期使用的数据预先加载到处理器的缓存层级中。预取指令主要有两种基本形式:
- prefetcht0 :将临时数据预加载到处理器缓存层级的所有级别。
- prefetchnta :将非临时数据预加载到L2缓存,有助于减少缓存污染。
需要注意的是,这两种预取指令只是向处理器提供程序预期使用数据的提示,处理器可以选择执行预取操作,也可以忽略该提示。
预取指令适用于多种数据结构,如大型数组和链表。链表是节点的顺序集合,每个节点包含数据部分和一个或多个指向相邻节点的指针。链表的优点是其大小可以根据数据存储需求增长或缩小,但缺点是节点通常不存储在连续分配的内存块中,这会增加遍历链表时的访问时间。
以下是不同CPU上X86 - 64函数的平均执行时间(单位:微秒):
| CPU | CalcResultCpp | CalcResultA_(movaps) | CalcResultB_(movntps) |
| ---- | ---- | ---- | ---- |
| Intel Core i7 - 4770 | 585 | 572 | 468 |
| Intel Core i7 - 4600U | 776 | 768 | 583 |
| Intel Core i3 - 2310M | 1714 | 1707 | 1702 |
超级会员免费看
订阅专栏 解锁全文
1

被折叠的 条评论
为什么被折叠?



