Round-Robin

Round-Robin是非常常见的一种资源调度算法。假设有100个竹篮给八个人来做,那么把八个人围成一圈:

while (true) {
  if (这个人 空闲) 分配一个竹篮给他;
  if (没有更多竹篮) break;
  这个人 = 下一个;
}

故事

round robin 来源于法语ruban rond(round ribbon),意思是环形丝带。

在17、18世纪时法国农民希望以请愿的方式抗议国王时,通常君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈(如同一条环状的带子),这样就找不出带头大哥,于是只能对所有参与者进行同样的惩罚。

1731年,英国皇家海军最初使用了这个名词,以循环顺序签署请愿书,这样就没法找到带头大哥了。

一种实现

template
Iterator round_robin(Iterator begin, Iterator end, Iterator &curr, Choose choose) {
    assert(curr >= begin && curr < end);
    for (auto i = curr; i < end; i++) {
        if (choose(*i)) {
            curr = i + 1;
            curr = (curr == end) ? begin : curr;
            return i;
        }
    }
    for (auto i = begin; i < curr; i++) {
        if (choose(*i)) {
            curr = i + 1;
            return i;
        }
    }
    return end;
}

GPU执行核的调度:

enum class CoreStatus {
    BUSY = 0,
    FREE = 1,
};

int main(int argc, char *argv[]) {
    auto core_status = std::vector{
        CoreStatus::BUSY,
        CoreStatus::FREE,
        CoreStatus::FREE,
        CoreStatus::BUSY,
        CoreStatus::BUSY
    };
    auto begin = core_status.begin();
    auto end   = core_status.end();
    auto curr  = core_status.begin();

    auto core_free = round_robin(begin, end, curr, [](CoreStatus cs){ return cs == CoreStatus::FREE; });

    std::cout << static_cast(*curr) << std::endl;

    return EXIT_SUCCESS;
}

参考资料

[1] https://zhuanlan.zhihu.com/p/84799744

你可能感兴趣的:(Round-Robin)