ps-lite源码分析: 系统参数

1.节点角色ID
三种节点,Scheduler节点只有一个,多个Worker和多个Server可以组成一个Group,因此有WorkerGroup和ServerGroup;还有Worker节点和Server节点。每个节点以及每一个Group都有唯一确定的ID。Scheduler、ServerGroup、WorkerGroup节点ID确定如下:
static const int kScheduler = 1;
static const int kServerGroup = 2;
static const int kWorkerGroup = 4;
1、2、4的二进制表示分别为:001、010、001。这样可以做Group之间的合并,例如要和ServerGroup和WorkerGroup发信息,只需要destination node id设为2+4=6。
1-7用来表示节点的组合,用以广播消息。单个节点的ID从8开始,用以发送点对点信息。
单个Server和单个Worker节点从自己的rank(0、1、2……)转换到其ID:
static inline int WorkerRankToID(int rank) {
return rank * 2 + 9;
}
static inline int ServerRankToID(int rank) {
return rank * 2 + 8;
}

从ID到其rank转换:
static inline int IDtoRank(int id) {
return std::max((id - 8) / 2, 0);
}

Postoffice中td::unordered_map<int, std::vector<int>> node_ids_保存了Node/NodeGroup与连接节点集合的对应关系。

Start方法:
(1)通过init_stage_控制是否需要初始化,如果已经初始化则跳过;
如果未初始化,则调用InitEnvironment进行环境初始化,创建van_,获取num_workers_与num_servers_,并设置当前节点角色,设定verbose;根据num_workers_和num_serverse_信息,填充节点组( kWorkerGroup, kServerGroup, kScheduler, kWorkerGroup + kServerGroup, kWorkerGroup+kScheduler, kServerGroup+kScheduler, kWorkerGroup + kServerGroup + kScheduler)包含的节点信息以初始化node_ids_;
(2)调用van_->Start(customer_id);
从环境中获取获取scheduler的主机名、端口、角色、ID,并根据postoffice的is_scheduler()判断当前节点角色是否是scheduler;如果是则设置van的my_node_信息为scheduler信息;否则设置van的my_node_信息为当前节点的IP、端口、角色,ID设置为默认空待后面scheduler分配后修改,并设置van的customer_id;然后绑定本地端口,并连接至scheduler节点;启动接收线程;下面对于非scheduler节点,给scheduler节点发送注册节点控制消息;等待ready或超时,然后根据环境配置确定是否创建resender_,如果不是scheduler节点则启动心跳线程;
(3)记录启动时间,设置Barrier(customer_id, kWorkerGroup + kServerGroup + kScheduler);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容