腾讯高性能图计算框架Plato代码阅读 进程启动及环境初始化
Posted archimekai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯高性能图计算框架Plato代码阅读 进程启动及环境初始化相关的知识,希望对你有一定的参考价值。
腾讯高性能图计算框架Plato代码阅读(一) 进程启动及环境初始化
archimekai archimekai@163.com
引言
Plato是腾讯开源的高性能分布式图计算框架。Plato吸收了Gemini和KnightKing两个学术界系统的优秀思想,常见算法的执行性能可以比Spark GraphX快一到两个数量级,同时内存消耗比Spark GraphX降低一到两个数量级。
接下来我们以PageRank算法为例阅读plato源代码,学习其中的设计方法和编程技巧。
进程启动及环境初始化
进程启动命令
进程启动命令在 run_pagerank.sh 中,可以看到,其中使用了mpiexec.hydra 进行了pagerank任务的启动,简化后的启动命令为:
mpiexec.hydra -n 4 ./pagerank --threads 4
mpiexec.hydra为Intel提供的MPI作业启动命令,命令手册。
-n 4 为local hydra options,其含义为,启动4个MPI进程,4个MPI进程协同执行./pagerank作业。
集群场景下,可以通过mpiexec.hydra提供的 -hostfile全局参数指定要执行任务的机器。
集群信息初始化
./pagerank作业所对应的main函数在pagerank.cc
集群信息需要使用initialize方法初始化,如下:
auto& cluster_info = plato::cluster_info_t::get_instance();
cluster_info.initialize(&argc, &argv);
核心操作在cluster_info_t.initialize()方法中,关键代码如下 :
void initialize(int* argc, char*** argv)
install_oneshot_signal_handlers();
MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided);
MPI_Comm_size(MPI_COMM_WORLD, &partitions_);
MPI_Comm_rank(MPI_COMM_WORLD, &partition_id_);
threads_ = numa_num_configured_cpus();
omp_set_dynamic(0);
omp_set_num_threads(threads_);
sockets_ = numa_num_configured_nodes();
initialized = true;
这个函数主要做了以下几件事:
- 通过install_oneshot_signal_handlers()屏蔽大部分信号
- 初始化MPI环境,以当前所使用的MPI进程数作为partitions_,也即有几个MPI进程,就将图切分为几个分区,以当前进程所处的MPI rank作为进程负责加载和处理的图分区编号。
- 通过numa_num_configured_cpus()获取当前系统中CPU的数目(核数),参考 https://linux.die.net/man/3/numa
- 初始化OpenMP环境,omp_set_dynamic(0) 表示禁用动态调节线程数的功能,omp_set_num_threads(threads_)表示将OpenMP的线程数设置为当前系统中CPU的数目。这一设置会影响后面标记了#pragma omp parallel的代码区域,在这些区域中, 会按照上述设置并行执行计算。
- 通过numa_num_configured_nodes()获取当前系统中memory nodes的数量,保存在sockets_变量中,可以简单理解为numa系统中物理上安装了几个CPU。sockets_变量会用在后面的numa亲和计算中。
集群信息初始化完毕后,就进入图加载和图切分的环节,我们下回再讲。
以上是关于腾讯高性能图计算框架Plato代码阅读 进程启动及环境初始化的主要内容,如果未能解决你的问题,请参考以下文章
腾讯高性能图计算框架Plato代码阅读 进程启动及环境初始化