070418

並列処理実用?

並列処理により、
現在時間がかかって実用しづらい処理を、
早くして実用にする

1時間 =1/10⇒ 6分

8時間 =1/10⇒ 48分

「ちょっと計算して試す」が可能になる
背景

マルチコアのCPUが入手可能になった



PC教室に並んだPCを使える



Intel Xeon 4コア⇒近々8コアに
AMD 8コアに
夜や休暇期間などは空いている
個々のPCは「並み」でも、90台×4教室
ソフト環境(プラットフォーム・コンパイラ)も
徐々に整備されてきている
先行研究~山のようにある

2つのモデル ~ メモリ共有vsメッセージ
CPU
CPU
CPU
メモリ
CPU
メモリ
CPU
CPU
メモリ
メモリ
CPU
メモリ
•プログラムもデータも共有できる
•プログラムもデータも共有しない
•別CPUへのデータ受け渡し早い
•別CPUへのデータ受け渡し遅い
•CPUの数に上限(数個~数十)
•多CPUも可(数百~数千)
先行研究~山のようにある

CPU×N台でも、N倍早くはならない






(本質的に)どうしても直列部分がある
並列化の腕が悪いと、直列部分が増える
N倍に近づける努力は大変
自動並列化は未だ課題が多い
今までは並列化するよりCPU高速化が安かった
自明な問題もある ~ それを対象にしたい
オープンな並列インタフェース?

メモリ共有型 ⇒ OpenMP



ライブラリが提供される、カーネルは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