PCクラスタを作ろう!! 廣安 知之 同志社大学 工学部 知識工学科 [email protected] Cluster clus·ter n. Ⅰ 〔ブドウ・サクランボ・フジの花などの〕房(ふさ) 〔of〕a cluster of grapes 一房のブドウ. Ⅱ 〔同種類のもの・人の〕群れ, 集団 〔of〕a cluster of spectators 一団の観客. a cluster of butterflies チョウの群れ. a cluster of stars 星団. in a cluster (一つに)かたまって, 群れをなして. in clusters いくつもの群れをなして, かたまりになって. New College English-Japanese Dictionary, 6th edition (C) Kenkyusha Ltd. 1967,1994,1998 PCクラスタ 並列計算機 このチュートリアル講座では... PCクラスタという並列計算機 計算機の作り方 ハードウエア ソフトウエア 並列計算の仕方 一般的なプログラムの作成 進化的計算(GAなど)の並列モデル でも本当は教えたくない!? 導入が極めて簡単(大規模・高度 なシステムは難しい) 並列処理の研究には明日はないか もしれないが,経済問題,バイオイン フォマティクスとならんで,並列アプリ ケーションには夢がある.(閉塞を打破しよ う...情報処理学会誌 2001.7,8) 並列アプリケーションには明日があ る!? 高速に処理が可能 創発アルゴリズム(特に進化的計算ア ルゴリズム)は確実に高速化が可能 計算パラダイムが変わる?(P2Pなど) 創発アルゴリズム(特に進化的計算ア ルゴリズム)には秘策がある はずかしい並列 (embarrassing parallel) P P P P P P P P パラメトリックサーチ 創発アルゴリズム(特に進化的計算 アルゴリズム)の秘策 ある探索アルゴリズムで25%の確率で解が発見できる場合 P P P P 初期解のbroadcast 解の収集・ベスト解の選択 並列アルゴリズムによって100%の確率で解が発見可能!! 何故,並列処理を行わなけれ ばならないか? 何故並列処理を行わなければならないのか? 高速に処理をおこなわなければならない 計算コストが高い 繰り返しを多く必要とする 大規模な問題 進化的計算手法 Features 生物の遺伝と進化 様々な問題に比較的簡単に適用可能 計算負荷が高い 個体数が多い 1つの仕事はサブタスクに分割可能 High Performance Computing (HA) 何故並列処理を行わなければならないのか? 特に進化的計算の場合は威力を発揮(後で詳しく 説明) 何故並列処理を行わなければならないのか? ex. SETI@home 計算パラダイムの変化 Project rc5 Intel 計算資源は余っている. Philanthoropic 研究室のパソコン P2P Program 実習室・演習室のパソコン 景気刺激対策で導入された大型計算機 その他 グローバルコンピューティング インターネット接続による大規模システム P2P NapsterやGnutellaを代表とする分散システム 並列処理の必要性はわかったが 何故PCクラスタなのか? Top500 http://www.top500.org Name # Proc 1 ASCI White 8192 2 SP Power3 2528 2526 3 ASCI Red 9632 2379 ASCI Blue-Pacific 5808 2144 SR8000/MPP 1152 1709 Ranking 4 5 Parallel Computers Rmax (Gflops) 7226 Commodity Hardware CPU Networking Pentium Internet Alpha Power etc. Lan Wan Gigabit cable less etc. PCs + Networking PC Clusters なぜPCクラスターなのか? hardware Commodity Off-the-shelf Software Open source Free ware Peopleware 大学の学生,助手,講師 研究所のおたく 高い性能 低コスト 簡単なセットアップ 簡単な利用 占有可能 Top500 http://www.top500.org Name # Proc 36 SCore III 1024 42 CPlant Cluster 1000 512.4 102 LosLobos 512 237 156 CLIC PIII 528 143.3 389 ABACUS Cluster 520 80.8 439 Presto III 104 77.4 Ranking Rmax (Gflops) 547.9 並列計算機の分類 簡単なPCクラスタを作ろう!! PCクラスタ 8nodes + gateway(file server) Fast Ethernet Switching Hub 150万 何を準備すれば良いのか? Hardware CPU memory motherboard hard disc case network card cable hub Normal PCs 何を準備すれば良いのか? Software OS tools Editor Compiler Parallel Library メッセージパッシング ソケット 意味: 「接続の端点」 コンピュータとTCP/IPを つなぐ出入り口 ソケット TCP/IP ソケット通信 ソケットを使って通信を行うには 2つのプログラムが必要 クライアントプログラム ソケットを用意して サーバに接続要求を行う サーバプログラム ソケットを用意して接続要求を待つ ソケット通信とは 接続待ちのサーバを クライアントが探す 接続待ち サーバを探す サーバ側 クライアント側 ソケット通信とは サーバが見つかったら 接続して通信 接続を受信 サーバを見つけて接続 サーバ側 クライアント側 メッセージパッシングライブラリ PVM (Parallel Virtual Machine) http://www.epm.ornl.gov/pvm/pvm_home.html PVM was developed at Oak Ridge National Laboratory and the University of Tennessee. MPI (Message Passing Interface) http://www-unix.mcs.anl.gov/mpi/index.html MPI is an API of message passing. 1992: MPI forum 1994 MPI 1 1887 MPI 2 MPIの実装 Free Implementation MPICH : LAM: WMPI : Windows 95,NT CHIMP/MPI MPI Light Bender Implementation Implementations of parallel computers MPI/PRO : クラスタの構築の手順 複数台のPCを用意する PCをつなげる OSとtoolをインストールする 開発toolと並列ライブラリをインストール OS/tools Linux GNU Compiler, GDB rsh MPICH/LAMのインストール # rpm –ivh lam-6.3.3b28-1.i386.rpm # rpm –ivh mpich-1.2.0-5.i386.rpm # # # # dpkg –i lam2_6.3.2-3.deb dpkg –i mpich_1.1.2-11.deb apt-get install lam2 apt-get install mpich ソケット通信の流れ 1 ソケット生成 (socket) ソケット生成 (socket) クライアント サーバ ソケット通信の流れ 2 サーバを探す (gethostbyname) クライアント 接続の準備 (bind/listen) サーバ ソケット通信の流れ 3 接続要求 (connect) クライアント 接続受理 (accept) OK! サーバ ソケット通信の流れ 4 通信 (send/recv) 通信 (send/recv) こんにちわ クライアント こんにちわ サーバ ソケット通信の全体の流れ クライアント サーバ ソケット生成(socket) ソケット生成(socket) サーバを探す (gethostbyname) 接続の準備(bind) 接続待機(listen) 接続要求(connect) 識別情報 接続受信(accept) データ送受信(send/recv) データ送受信(send/recv) ソケットを閉じる(close) ソケットを閉じる(close) クライアントプログラム(C) //client.c #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<string.h> #define PORT (u_short)10000 #define BUF_LEN 100 char hostname[]="localhost"; char buf[BUF_LEN]; main() { struct hostent *servhost; struct sockaddr_in server; int s; servhost = gethostbyname(hostname); bzero((char *)&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = PORT; bcopy(servhost->h_addr, (char *)&server.sin_addr,servhost->h_length); s = socket(AF_INET,SOCK_STREAM,0); connect(s,(void *)&server,sizeof(server)); read(s,buf,BUF_LEN); printf(buf); close(s); } サーバプログラム(C) //server.c me.sin_family = AF_INET; me.sin_port = PORT; #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<string.h> #define PORT (u_short)10000 char hostname[] = "localhost"; bcopy(myhost->h_addr, (char *)&me.sin_addr,myhost->h_length); s_waiting = socket(AF_INET,SOCK_STREAM,0); bind(s_waiting,(void *)&me,sizeof(me)); main() listen(s_waiting, 1); { s = accept(s_waiting, NULL, NULL); struct hostent *myhost; close(s_waiting); struct sockaddr_in me; int s_waiting, s; write(s, msg, strlen(msg)); char msg[] = "Hello World!!\n"; close(s); myhost = gethostbyname(hostname); bzero((char *)&me, sizeof(me)); } クライアントプログラム(Java) import java.io.*; import java.net.*; import java.lang.*; //サーバ側から送信された文字列を受信 byte[] buff = new byte[1024]; int a = is.read(buff); System.out.write(buff, 0, a); public class Client{ public static void main( String[] args ){ //ストリーム,ソケットをクローズ is.close(); socket.close(); try{ //ソケットを作成 String host="localhost"; Socket socket = new Socket( host, 10000 ); //入力ストリームを作成 DataInputStream is = new DataInputStream ( new BufferedInputStream( socket.getInputStream())); }catch(Exception e){ System.out.println(e.getMessage()); e.printStackTrace(); } } } サーバプログラム(Java) //Server.java import java.net.*; import java.lang.*; import java.io.*; //ストリーム,ソケットをクローズ os.close(); cliSocket.close(); svSocket.close(); }catch( Exception e ){ System.out.println(e.getMessage()); e.printStackTrace(); } public class Server{ public static void main( String[] args ){ try{ //ソケットを作成 ServerSocket svSocket = new ServerSocket(10000); //クライアントからのコネクション要求受付 Socket cliSocket = svSocket.accept(); //出力ストリームを作成 DataOutputStream os = new DataOutputStream( new BufferedOutputStream( cliSocket.getOutputStream())); //文字列を送信 String s = new String("Hello World!!\n"); byte[] b = s.getBytes(); os.write(b, 0, s.length()); } } 並列計算の枠組み (MPI) Massive parallel computer gateway user Jobs Tasks PC-Cluster 並列計算の分類 MPIの枠組み # include “mpi.h” int main( int argc, char **argv ) { MPI_Init(&argc, &argv ) ; MPI_Comm_size( …… ); MPI_Comm_rank( …… ) ; Initialization Communicator Acquiring number of process Acquiring rank /* parallel procedure */ MPI_Finalize( ) ; return 0 ; } Termination 通信方法 1対1通信 Process A Receive/send data グループ通信 Receive/send data Process B 1対1通信 [Sending] MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) void *buf:Sending buffer starting address (IN) int count:Number of Data (IN) MPI_ Datatype datatype:data type (IN) int dest:receiving point (IN) int tag:message tag (IN) MPI_Comm comm:communicator(IN) 1対1通信 [Receiving] MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status status) void *buf:Receiving buffer starting address (OUT) int source:sending point (IN) int tag:Message tag (IN) MPI_Status *status:Status (OUT) ~Hello.c~ #include <stdio.h> #include "mpi.h" void main(int argc,char *argv[]) { int myid,procs,src,dest,tag=1000,count; char inmsg[10],outmsg[]="hello"; MPI_Status stat; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myid); count=sizeof(outmsg)/sizeof(char); if(myid == 0){ src = 1; dest = 1; MPI_Send(&outmsg,count,MPI_CHAR,dest,tag,MPI_COMM_WORLD); MPI_Recv(&inmsg,count,MPI_CHAR,src,tag,MPI_COMM_WORLD,&stat); printf("%s from rank %d\n",&inmsg,src); }else{ src = 0; dest = 0; MPI_Recv(&inmsg,count,MPI_CHAR,src,tag,MPI_COMM_WORLD,&stat); MPI_Send(&outmsg,count,MPI_CHAR,dest,tag,MPI_COMM_WORLD); printf("%s from rank %d\n",&inmsg,src); } MPI_Finalize(); } 1対1通信 MPI_Recv(&inmsg,count,MPI_CHAR,src, tag,MPI_COMM_WORLD,&stat); MPI_Send(&outmsg,count,MPI_CHAR,dest, tag,MPI_COMM_WORLD); MPI_Sendrecv(&outmsg,count,MPI_CHAR,dest, tag,&inmsg,count,MPI_CHAR,src, tag,MPI_COMM_WORLD,&stat); π計算 -Parallel conversion- 4 dx 2 0 1 x 1 4 3.5 3 部分に分割 y 2.5 2 分割部分を各プロ セッサに割り当て 1.5 1 0.5 結果を収集 0 0.1 0.2 0.3 0.4 0.5 0.6 x 0.7 0.8 0.9 1 グループ通信 Broadcast MPI_Bcast( void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm ) Rank of sending point Data グループ通信 • Communication and operation (reduce) MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm ) Operation handle Rank of receiving point Operation MPI_SUM, MPI_MAX, MPI_MIN, MPI_PROD π計算の流れ PCクラスタの高性能化 CPU Hardware Intel Pentium III, IV http://www.intel.com/ http://www.amd.com/ AMD Athlon Transmeta Crusoe http://www.transmeta.com/ Network Ethernet Gigabit Ethernet Myrinet QsNet Giganet SCI Gigabit Wake On LAN ネットワークの2重化 Hardware Atoll VIA Infinband Myrinet • Myricom社が開発 • PCクラスタコンピューティングの デファクト・スタンダードとして期待 – EthernetやATMなどより優れた 性能,コストパフォーマンスを発揮 各ネットワークの性能比較(1) 各ネットワークの性能比較 (2) 従来の通信 送信側 ユーザ アドレス空間 受信側 ユーザ アドレス空間 データ データ コ ピー コ ピー データ データ カーネル アドレス空間 カーネル アドレス空間 データ データ NIC NIC ゼロコピー通信 送信側 ユーザ アドレス空間 受信側 ユーザ アドレス空間 データ データ カーネル アドレス空間 カーネル アドレス空間 データ データ NIC NIC ハードディスク Hardware SCSI IDE Raid Diskless Cluster http://www.linuxdoc.org/HOWTO/Diskless-HOWTO.html ジャーナリングファイルシステム ケース Box inexpensive Rack compact maintenance Hardware ソフトウエア Software OS Linux Kernels Open source Free ware Features network The /proc file system Loadable kernel modules Virtual consoles Package management OS Linux Kernels http://www.kernel.org/ Linux Distributions Red Hat Debian GNU/Linux S.u.S.E. Slackware www.redhat.com www.debian.org www.suse.com www.slackware.org 管理ツール NFS(Network File System) NIS (Network Information System) NTP (Network Time Protocol) server client client client リソースマネージメントとスケジューリングツール プロセスの分配 ロードバランス 複数タスクのジョブ管理 CONDOR http://www.cs.wisc.edu/condor/ DQS http://www.scri.fsu.edu/~pasko/dqs.html LSF http://www.platform.com/index.html The Sun Grid Engine http://www.sun.com/software/gridware/ プログラミング開発ツール Editor Language Compiler Emacs C, C++, Fortran, Java GNU http://www.gnu.org/ NAG http://www.nag.co.uk PGI http://www.pgroup.com/ VAST http://www.psrv.com/ Absoft http://www.absoft.com/ Fujitsu http://www.fqs.co.jp/fort-c/ Intel http://developer.intel.com/software/ products/compilers/index.htm プログラミング開発ツール Make CVS Debugger Gdb Total View http://www.etnus.com MPIの実装 mpich http://www-unix.mcs.anl.gov/mpi/index.html Easy to use High portability for UNIX, NT/Win, Globus Lam http://www.lam-mpi.org/ High availability MPICH VS LAM (SMP) # node Processor type Memory OS Network DGA Gcc(2.95.3), mpicc -O2 –funroll - loops 60 40 30 40 30 20 20 10 10 0 0 0 1X 5X 10X 50X 100X 500X 50 Speedup 50 Speedup 60 1X 5X 10X 50X 100X 500X 20 40 60 32 ,2 Pentium III 700MHz 128 Mbytes Linux 2.2.16 Fast Ethernet,TCP/IP Switching HUB 0 20 40 Number of Process Number of Process LAM (6.3.2) MPICH (1.2.1) 60 MPICH VS LAM (# process) # node processor memory OS Network 8 8 6 6 4 Speedup Speedup DGA Gcc(2.95.3), mpicc -O2 –funroll - loops 1X 5X 10X 50X 100X 500X 2 8 PentiumⅢ 850MHz 256 Mbytes Linux 2.2.17 Fast Ethernet,TCP/IP Switching HUB 4 2 0 0 0 10 20 30 0 10 20 Number of Process Number of Process LAM (6.4-a3) MPICH (1.2.0) 30 プロファイラー MPE (MPICH) Paradyn http://www.cs.wisc.edu/par adyn/ Vampier http://www.pallas.de/pages/ vampir.htm Win用のメッセージパッシングライブラリ PVM MPI PVM3.4 WPVM mpich WMPI(Critical Software) MPICH/NT (Mississippi State Univ.) MPI Pro (MPI Software Technology) クラスタのディストリビューション FAI http://www.informatik.uni-koeln.de/fai/ Alinka http://www.alinka.com/ Mosix http://www.mosix.cs.huji.ac.il/ Bproc http://www.beowulf.org/software/bproc.html Scyld http://www.scyld.com/ Score http://pdswww.rwcp.or.jp/dist/score/html/index.html Kondara HPC http://www.digitalfactory.co.jp/ Math Library PhiPac from Berkeley FFTW from MIT www.fftw.org Atlas Automatic Tuned Linear Algebra software www.netlib.org/atlas/ ATLAS is an adaptive software architecture and faster than all other portable BLAS implementations and it is comparable with machine specific libraries provided by the vender. Math Library PETSc PETSc is a large stuite of data structures and routines for both uni and parallel processor scientific computing. http://www-fp.mcs.anl.gov/petsc/ 遺伝的アルゴリズム GAsの並列モデル Master Slave (Micro grained ) Cellular (Fine grained) Distributed GAs (Island, Coarse grained) Amdahl’s low Speed up = 1 (1 – r) + r / Number of processors r: ratio of parallelization 20 0.90 15 0.80 0.50 10 2000 5000 10000 200 500 1000 50 100 0 2 5 10 20 5 1 Speed up 0.95 Number of Processors Master Slave model Master node crossover mutation evaluation evaluate evaluate client client client client client client a) delivers each individual to slave b) returns the value as soon as finishes calculation selection evaluate client client client c) sends nonevaluated individual from master Cellular GAs Distributed Genetic Algorithms (Island GAs) subpopulation migration Migration interval Generation Distributed Genetic Algorithms island 0 island 1 island n GA GA GA migration GA GA GA migration = migration rate Cambria Visual Technology # node 256 # CPUs: 256 CPU: Pentium III 0.8GHz Memory:32GB(128MB × 256) Hard Disc: Network: FastEithernet Hub: DGAの並列化効率 DGAsの探索性能 教科書,Web sites,その他 教科書 “Building Linux Clusters” “How to Build Beowulf” “High Performance Cluster Computing” 教科書 MPI並列プログラミング 虎の巻きシリーズ Web sites IEEE Computer Society Task Force on Cluster Computing http://www.ieeetfcc.org/ White Paper http://www.dcs.port.ac.uk/~mab/tfcc/WhitePaper/ Cluster top 500 http://clusters.top500.org/ Beowulf Project http://www.beowulf.org/ Beowulf Under Ground http://www.beowulf-underground.org/ 学会その他 IEEE TFCC 超並列計算研究会 SOFTEK HPC メイリングリスト Debian Beowulf このチュートリアルでは…. クラスタのコンセプト クラスタの作り方 並列GA
© Copyright 2024 ExpyDoc