並列処理実用? 並列処理により、 現在時間がかかって実用しづらい処理を、 早くして実用にする 1時間 =1/10⇒ 6分 1時間 =1/10⇒ 6分 8時間 =1/10⇒ 48分 「ちょっと計算して試す」が可能になる
背景 マルチコアのCPUが入手可能になった PC教室に並んだPCを使える Intel Xeon 4コア⇒近々8コアに AMD 8コアに PC教室に並んだPCを使える 夜や休暇期間などは空いている 個々のPCは「並み」でも、90台×4教室 ソフト環境(プラットフォーム・コンパイラ)も 徐々に整備されてきている
先行研究~山のようにある 2つのモデル ~ メモリ共有vsメッセージ プログラムもデータも共有できる 別CPUへのデータ受け渡し早い プログラムもデータも共有しない 別CPUへのデータ受け渡し遅い 多CPUも可(数百~数千)
先行研究~山のようにある CPU×N台でも、N倍早くはならない 自明な問題もある ~ それを対象にしたい (本質的に)どうしても直列部分がある 並列化の腕が悪いと、直列部分が増える N倍に近づける努力は大変 自動並列化は未だ課題が多い 今までは並列化するよりCPU高速化が安かった 自明な問題もある ~ それを対象にしたい
オープンな並列インタフェース? メモリ共有型 ⇒ OpenMP メッセージパシング型 ⇒ MPICH2 ライブラリが提供される、カーネルはLinux組み込み済み 自動コンパイラもいくつか存在(Intelなど) メッセージパシング型 ⇒ MPICH2 TCP/IPを使う ⇒ どうしてもオーバーヘッド大 ライブラリが提供される 自動は見かけない(無理?)
最初の実験環境 HPのサーバー:Xeon 4コア×2CPUで 8並列が可能なはず Linuxをインストールし利用可能 単純な並列度テスト
最初の実験環境(続) #!/bin/csh set N = 100000000 # Case of 1 process #echo "" | pipebody $N #Case of 8 processes echo "" | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $N | pipebody $ N | pipebody $N | pipebody $N
最初の実験環境(続) for (i=0; i<255; i++) bufin[i]='\0'; x = 0.0; for (i=0; i<maxi; i++) { x = x + sin( (double) i/maxi ); } read(0, bufin, 256); printf("%s", strcat(bufin, "a")); fprintf(stderr, "%s", strcat(bufin, "a"));
最初の実験環境(結果) user system elapsed PCPU プロセス1つ: 9.720u 0.028s 0:09.74 100.0% 0+0k 0+0io 0pf+0w プロセス4つ: 38.814u 0.036s 0:09.75 398.3% 0+0k 0+0io 0pf+0w プロセス8つ: 77.476u 0.020s 0:09.76 793.9% 0+0k 0+0io 0pf+0w プロセス9つ: 87.301u 0.040s 0:14.62 597.4% 0+0k 0+0io 0pf+0w プロセス12: 116.407u 0.028s 0:15.93 730.8% 0+0k 0+0io 0pf+0w プロセス16: 155.189u 0.044s 0:19.54 794.3% 0+0k 0+0io 0pf+0w