什么是“缓存友好”代码?

什么是“缓存友好”代码?

缓存不友好代码“和”缓存友好“密码?

如何确保编写高效缓存代码?


幕布斯7119047
浏览 755回答 3
3回答

湖上湖

除了@marc Claesen的答案之外,我认为缓存不友好代码的一个具有指导意义的典型示例是按列而不是逐行扫描C二维数组(例如位图图像)的代码。行中相邻的元素在内存中也是相邻的,因此按顺序访问它们意味着按升序访问它们;这是对缓存友好的,因为缓存倾向于预取连续的内存块。相反,按列访问这些元素是缓存不友好的,因为同一列上的元素在内存中彼此之间的距离很远(特别是,它们的距离等于行的大小),所以当您使用这种访问模式时,您正在内存中跳转,这可能会浪费缓存在内存中检索元素的努力。破坏演出的唯一方法就是//&nbsp;Cache-friendly&nbsp;version&nbsp;-&nbsp;processes&nbsp;pixels&nbsp;which&nbsp;are&nbsp;adjacent&nbsp;in&nbsp;memoryfor(unsigned&nbsp;int&nbsp;y=0;&nbsp;y<height;&nbsp;++y){ &nbsp;&nbsp;&nbsp;&nbsp;for(unsigned&nbsp;int&nbsp;x=0;&nbsp;x<width;&nbsp;++x) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;image[y][x]&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;}}到//&nbsp;Cache-unfriendly&nbsp;version&nbsp;-&nbsp;jumps&nbsp;around&nbsp;in&nbsp;memory&nbsp;for&nbsp;no&nbsp;good&nbsp;reasonfor(unsigned&nbsp;int&nbsp;x=0;&nbsp;x<width;&nbsp;++x){ &nbsp;&nbsp;&nbsp;&nbsp;for(unsigned&nbsp;int&nbsp;y=0;&nbsp;y<height;&nbsp;++y) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;image[y][x]&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;}}在具有小缓存和/或与大数组(例如当前机器上的10多万像素24 BPP图像)工作的系统中,这一效果可能相当显著(几个数量级的速度);因此,如果您必须做许多垂直扫描,通常最好先旋转90度的图像,然后执行各种分析,从而限制缓存-不友好的代码仅限于旋转。
打开App,查看更多内容
随时随地看视频慕课网APP