多台计算机一起编译
1. 两台win7电脑如何实现并行运算
.首先确定需要的硬件组件和资源。您将需要一个头节点,至少有十几个相同的计算节点,以太网交换机,配电装置和机架。确定的电力需求,散热和空间要求。又决定您要为您的专用网络IP地址,命名为节点,您要安装的软件包,你想要什么样的技术提供的并行计算能力(更多关于这个版本)。虽然硬件不能随意下载,所有软件中列出的是免费的,大部分都是开源的。 (2)/建立计算节点。您将需要组装的计算节点,或获得预构建服务器。更多的计算节点,建立更强大的超级计算机!选择一台服务器机箱,空间,冷却和能源效率最大化。或者,你可以用十几个这样用的,过时的服务器 - 其整体将超过其部分的总和还为您节省了相当大的一次性现金。为整个系统一起玩的很好,所有的处理器,网络适配器和主板应该是相同的。当然,不要忘了内存和存储每个节点和至少一个光盘驱动器的头节点。
3.服务器安装到机架上。从底部开始,机架不是最重。你需要一个朋友来帮助你这一点 - 高密度服务器可以非常重,并引导他们到机架上的导轨有困难的。
4.以上的服务器机箱中安装的以太网交换机。利用这一时刻对交换机进行配置:允许9000个字节的巨型帧大小,设置IP地址的静态地址,您在步骤1中决定,并关闭不必要的路由协议,如SMTP侦听。
5.安装的PDU(电源分配单元)。您可能需要根据您的节点可能需要多少电流在最大负载,220伏的高性能计算。
6.一切都安装,就可以开始配置过程。 linux是事实上的OS为HPC集群不仅是科学计算的理想环境,但将它安装到数百甚至上千个节点,它不花费一件事。试想一下,所有这些节点上安装Windows的成本会是多少呢?首先安装最新版本的主板BIOS和固件,这应该是相同的所有节点上。您的首选的Linux发行版,安装在每个节点上,一个图形用户界面的头节点。受欢迎的选择,包括的CentOS,OpenSUSE中,红帽企业Linux和SLES。本文作者强烈建议用Rocks集群分布。除了安装所有必要的工具,计算群集功能,岩石许多情况下本身的节点,速度非常快,使用PXE引导和Red Hat的脚开始“程序”分派“使用一个很好的方法。
7.安装的消息传递接口,资源管理器,以及其他必要的库。如果你没有安装岩石在上一步中,你将不得不手动设置必要的软件,以使并行计算的机制。首先,你将需要一台便携式的bash的管理系统,如Torque资源管理器,它允许你分手,并分发到多台机器的任务。对扭矩的毛伊岛集群调度完成安装。接下来,您将需要安装的消息传递接口,独立的计算节点上的各个进程必须共享相同的数据。 OpenMP是一个没有脑子。不要忘了多线程数学库和编译器来构建并行计算程序。我提到,你应该只安装岩石?
8.网络计算节点。头节点的计算节点,而这又必须将返回的结果,以及发送消息给对方发送计算任务。速度越快越好。接线吧!使用专用的以太网网络连接在集群中的所有节点。头节点也可以作为一个NFS,PXE,DHCP,TFTP,NTP服务器通过以太网网络。从公共网络,确保广播数据包不与其他网络的干扰,在你的局域网,就必须将这个网络。
9.测试群集。过去的事情做之前,你可能要释放所有用户的计算能力是测试它的性能。的HPL(高性能Lynpack)的基准测量的集群的运算速度是一个受欢迎的选择。您需要将自己从源码编译所有可能的优化编译器提供你所选择的体系结构。当然,你必须从源代码编译为您的平台与所有可能的优化选项。例如,如果使用的是AMD的CPU,编译与Open64的与0fast优化水平。 TOP500在世界上最快的500台超级计算机集群的比较,比较的结果!
提示
使用Ganglia监控节点上的计算负载。 IPMI可以提供的KVM-over-IP,远程电源循环,多一个大型的集群管理的一件轻而易举的事。对于非常高的网络速度,到InfiniBand网络接口。准备,但支付较高的价格。
2. 为什么要用openmp+mpi混合编程技术求π
MPI(MPI是一个标准,有不同的具体实现,比如MPICH等)是多主机联网协作进行并行计算的工具,当然也可以用于单主机上多核/多CPU的并行计算,不过效率低。它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。缺点是使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。
OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算!
如果要多主机联网使用OpenMP(比如在超级计算机上),那必须有额外的工具帮助,比如 MPI + OpenMP 混合编程。或者是将多主机虚拟成一个共享内存环境(Intel有这样的平台),但这么做效率还不如混合编程,唯一的好处是编程人员可以不必额外学习MPI编程。
3. 如何加快linux android 的编译速度
项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。
1. 使用tmpfs来代替部分IO读写
2.ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失
3.distcc,多机器编译
4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。
tmpfs
有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。
这个做法的实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel来测试一下编译速度:
用物理磁盘:40分16秒
用tmpfs:39分56秒
呃……没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。
make -j
既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。
用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。
还是用Kernel来测试:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。
不过这个方案不是完全没有cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。
ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的方案根本不能正常工作,只有每次make clean再make才行。
安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。
安装的另外一种方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路径加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++
效果跟使用命令行ccache g++效果一样
这样每次用户登录时,使用g++编译器时会自动启动ccache
继续测试:
用ccache的第一次编译(make -j4):23分38秒
用ccache的第二次编译(make -j4):8分48秒
用ccache的第三次编译(修改若干配置,make -j4):23分48秒
看来修改配置(我改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很实用。
可以用ccache -s来查看cache的使用和命中情况:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,显然只有第二编次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了81.7M的磁盘,还是完全可以接受的。
distcc
一台机器的能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。
使用distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。
distcc安装后,可以启动一下它的服务:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默认的3632端口允许来自同一个网络的distcc连接。
然后设置一下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然后与ccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。
在make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。
同样测试一下:
一台双核计算机,make -j4:23分16秒
两台双核计算机,make -j4:16分40秒
两台双核计算机,make -j8:15分49秒
跟最开始用一台双核时的23分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。
在编译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。
总结一下:
tmpfs: 解决IO瓶颈,充分利用本机内存资源
make -j: 充分利用本机计算资源
distcc: 利用多台计算机资源
ccache: 减少重复编译相同代码的时间
这些工具的好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。
5.还有提速方法是把屏幕输出重定向到内存文件或/dev/null,因对终端设备(慢速设备)的阻塞写操作也会拖慢速度。推荐内存文件,这样发生错误时,能够查看。