Round-Robin是非常常见的一种资源调度算法。假设有100个竹篮给八个人来做,那么把八个人围成一圈:
while (true) {
if (这个人 空闲) 分配一个竹篮给他;
if (没有更多竹篮) break;
这个人 = 下一个;
}
故事
round robin 来源于法语ruban rond(round ribbon),意思是环形丝带。
在17、18世纪时法国农民希望以请愿的方式抗议国王时,通常君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈(如同一条环状的带子),这样就找不出带头大哥,于是只能对所有参与者进行同样的惩罚。
1731年,英国皇家海军最初使用了这个名词,以循环顺序签署请愿书,这样就没法找到带头大哥了。
一种实现
template<typename Iterator, typename Choose>
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>{
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<uint32_t>(*curr) << std::endl;
return EXIT_SUCCESS;
}
网友评论