【发布时间】:2018-07-05 08:06:13
【问题描述】:
要在具有 24KB 6 路组关联数据缓存的 CPU 上对 [0, 220) 中的数字进行基数排序,如果选择基数 210,每个数字只能提供 24B 缓存,所以这段代码会导致很多缓存未命中:
int *x[1024], c[1024]={0};
for(int i=0; i<n; i++)c[A[i]&1023]++;
for(int i=0,s=0; i<1024; i++){x[i]=B+s; s+=c[i];}
for(int i=0; i<n; i++)*(x[A[i]&1023]++)=A[i]; // each ptr require 64B+ cache
所以我想到了跳过缓存直接用MOVNTSS将值存入内存,或者模拟16B缓存用MOVNTPS存入。 MOVNTSS 和缓存模拟的性能损失如何?还是取决于什么?
【问题讨论】:
-
x 数组中的指针是否指向(大部分)连续位置?
-
@HadiBrais paste.ubuntu.com/p/wF5Rrf27W2
-
我不太了解分布
-
只有当存储在虚拟地址空间中大部分是连续的时,您才能从 NT 存储中受益。您的处理器每个逻辑核心有 5 个写入组合缓冲区,每个缓冲区只能容纳一个高速缓存行。如果顺序写入不是到同一个高速缓存行,那么核心必须等待释放 WC 缓冲区,即使它只是部分写入。这需要直接写入主存,速度很慢。如果您有类似“可能的顺序访问”的东西,那么使用 NT 存储可能是个好主意。总的来说,我不能肯定地说。你必须测量它。
-
@HadiBrais NT 存储缓冲区是否需要等待 [写入成功] 才能准备下一次写入?
标签: assembly x86 sse cpu-cache