【问题标题】:Storing values in separate CPU cache banks将值存储在单独的 CPU 缓存组中
【发布时间】:2012-11-26 04:23:41
【问题描述】:

作为课堂项目的一部分,我正在研究提高 CPU 架构中寻路算法性能的方法。该算法是用 C++ 实现的。基本操作是读取 x,y 坐标并对它们执行一些操作。

我现在的想法是将 x 和 y 坐标分别存储在两个缓存组中(设置关联)。为一个位置输入的两个坐标应存储在不同的存储库中,以便能够并行读取它们,并对 x 和 y 坐标进行单独操作并存储组合结果。通过使用矢量运算,这个过程可以进一步加快,同时读取多达 4 个 x 坐标和 4 个 y 坐标。

例如,为了计算到目标节点的欧几里得距离,必须在每个位置读取 x 和 y 坐标并从目标坐标中减去以找出距离。

我想知道是否有一种有效的方法(缓存放置策略)将 x 和 y 坐标保持在不同的缓存行/块中以利用并行性。是否有任何坐标操作/编码可以用来实现它?

P.S:我不是在寻找软件优化,而是在寻找修改后的缓存设计(理论上)来加速算法。

Ref:blog post 提到“如果 L1 缓存访问来自不同 bank 的缓存行,则可以并行处理两个访问,如果它们属于同一 bank,则可以串行处理。”

【问题讨论】:

    标签: caching mips cpu-architecture cpu-cache


    【解决方案1】:

    这样的结构中的坐标:

    struct {
      int x;
      int y;
    } coordinate; 
    

    将适合单个缓存行。事实上,在具有 32 字节高速缓存行的典型 MIPS 处理器上,coordinate 的 8 个实例将适合一个高速缓存行。 CPU 将从数据缓存中的单个存储体或方式 一次读取整行,所有 32 字节或所有 4 个坐标将在 32 字节 填充/存储中可用缓冲区 (FSB) 以零延迟到流水线。具有高速缓存的 MIPS 处理器通常具有多个 FSB。

    具有分组或组关联缓存的MIPS 处理器通常使用LRU 算法来选择在缓存未命中时将新数据放入哪个组/通道。通常不可能确保来自某个位置的数据总是被放入缓存中的特定方式

    所有这一切都是说,您将 x 和 y 坐标存储在单独的缓存组中的方案不会比幼稚方案提高性能,因为 FSB 对幼稚方案的积极影响以及由于 way 缓存选择算法。

    【讨论】:

    • A bankway 不同。
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2013-08-27
    • 2012-07-05
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多