【问题标题】:In LRU square algorithm, is the least-recently-used row always zero?在 LRU 平方算法中,最近最少使用的行总是零吗?
【发布时间】:2013-11-21 20:58:36
【问题描述】:

我的 Hacker's Delight 副本在家里,我找到的网络资源并不清楚这个细节。

我使用著名的“行列平方”算法编写了以下 8 级 LRU。 (有更好的名字吗?)。

#include <stdint.h>

typedef union {
  uint8_t rows[8];  
  uint64_t cols;
} lru_state;

void lru_init(lru_state *this) {
  this->cols=0;
}

void lru_up(lru_state *this, int used /* in 0..7 */) {
  this->rows[used]=0xff;
  this->cols &= ~(0x0101010101010101 << used);
}

int lru_get(lru_state *this) {
  int i;
  for (i=1; i<8 ; i++) {
    if (0==(this->rows[i])) return i;
  }
  return 0;
}

我想确认我的假设,即最近最少使用的行将全为零。它似乎有效,但我没有数学来证明它令我满意。

那么,这是对的吗?还是我需要计算每一行的最小汉明权重?

【问题讨论】:

  • 注意:lru_get() 中的 for 循环从不测试 rows[0]。这是您的意图还是您希望采用的方式?
  • 我只是让它成为失败者。将其向上移动到循环中(没有失败)取决于这个问题的答案。
  • 我的 2 美分专业知识:同意你的说法。可移植性问题:有些机器是大端或小端,这会影响功能。一个好的编译器可以很好地处理 uint64_t FF = 0xff; cols |= FF &lt;&lt; (used*8);rows[used]=0xff; 并消除对联合的需要。
  • @chux,你将如何处理 lru_get() 中的测试?我认为我的版本还可以;只要 rows[i]=0xff 在与 0==rows[i] 相同的字节上运行,我并不真正关心内存排列。你同意吗?
  • if (0==(cols &amp; (FF &lt;&lt; (i*8)) )) return i; 或者设置一个掩码并移动它而不是增加i。顺便说一句:如果从未调用过lru_up(),您的断言是否会失败/起作用-您在乎吗?身份证。我没有看到初始条件,但如果我知道更多,我可以假设一些事情。

标签: c algorithm lru


【解决方案1】:

你的假设是正确的。

我们可以用反证法来证明:

假设 LRU 候选(零位最多的字节)是 c,并且在位置 x 设置了一个位。

这意味着在行 c 之后没有使用行 x,因此 x 必须具有 c 具有的所有零位,加上位置 x 的零。这是一个矛盾,因为 c 是具有最多零位的字节,因此我们得出结论 c 不能设置任何位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多