More Related Content Similar to 【12-B-4】 並列処理開発を支援するコンパイラの機能 Similar to 【12-B-4】 並列処理開発を支援するコンパイラの機能 (20) More from devsumi2009 (20) 【12-B-4】 並列処理開発を支援するコンパイラの機能3. なぜ並列化なのか ?
並列化は最適化テクニックの一つ
目的とするところは実行速度の向上
目的のために複数のプロセッサまたはコアを使う
1コア 4コア
並列化
時
間
4コア使うことにより、コアあ
たりの実行時間を1/4にする
8. スレッドモデル
アプリケーションを並列化するための明
確で基本的なスレッドモデル
開発者が多くの詳細な動作を定義:
スレッドの生成と管理
スレッド間で分担する作業
スレッド間の同期処理 …
このモデルの例
Javaスレッド、POSIXスレッド、
Solarisスレッド
9. 自動並列化 (-xautopar)
コンパイラが並列化(ループ処理が対象)
繰り返し部分を分割して並列実行
同一のバイナリであらゆるスレッド数に対応
for (i=0; i<1000; i++)
a[i] = b[i] + c[i];
OMP_NUM_THREADS=4
スレッド3
スレッド0 スレッド1 スレッド2
500-749 750-999
0-249 250-499
例: SPECfp2006で16%の向上(OMP_NUM_THREADS=2)
10. 自動並列化の例
% cc -c -fast -xrestrict -xautopar -xloopinfo mxv.c
quot;mxv.cquot;, line 3: PARALLELIZED, and serial
version generated
quot;mxv.cquot;, line 6: not parallelized, unsafe
dependence (sum)
1 void mxv(int m,int n,double *a,double *b[],double *c)
2 {
ループの並列化
3 for (int i=0; i<m; i++)
4 { j
5 double sum = 0.0;
6 for (int j=0; j<n; j++)
i
7 sum += b[i][j]*c[j]; = *
8 a[i] = sum;
9 }
10 }
11. 参考 : 自動ベクトル化 (-xvector=simd)
SIMD命令を使用するようにコンパイル
SSE2以降をサポートしたプラットフォームで
使用
ループ処理で効果的
for (i=0; i<1000; i++)
a[i] = b[i] + c[i];
for (i=0; i<1000; i++)
a[i:i+3] = b[i:i+3] + c[i:i+3];
12. OpenMP とは ?
C/C++、Fortranで共有メモリ型並列処理
を記述するためのデファクト
構成要素
コンパイラ指示、実行時処理、環境変数
OpenMP Architecture Review Board
(ARB)が仕様を管理
2008年5月にVersion 3.0リリース
http://www.openmp.org
13. OpenMP の利点
優れたパフォーマンスと拡張性
適切に使用すれば …
デファクトであり成熟した技術
非常に多くのコンパイラでサポート
要求されるプログラミング作業が少ない
逐次処理版を維持
段階的な並列化をサポート
マルチコアアーキテクチャに適合
軽量、HWスレッド上での効果的な実行
14. OpenMP の例
#pragma omp parallel for
parallel loop
for (int i=0; i<m; i++)
j
{
double sum = 0.0;
for (int j=0; j<n; j++)
i =
sum += b[i][j]*c[j]; *
a[i] = sum;
}
スレッド0 スレッド1
for (i=0,1,2,3,4) for (i=5,6,7,8,9)
i=0 i=5
sum = Σ b[i=0][j]*c[j] sum = Σ b[i=5][j]*c[j]
a[0] = sum a[5] = sum
i=1 i=6
15. OpenMP 3.0
2008年5月リリース
注目すべき理由
TASKのサポート
TASKによって幅広いアプリケーションが
並列化可能に
16. タスクのコンセプト
タスク指定に
スレッドはプー
遭遇したスレ
ルの中のタスク
ッドはプール
を実行
に追加
開発者はアプリケーション内でタスクを指定
実行時システムがタスクを実行
17. 例 - リンクリスト
........
while(my_pointer) {
(void) do_independent_work (my_pointer);
my_pointer = my_pointer->next ;
} // End of while loop
........
OpenMP 3.0より前は並列化が難しい:
繰り返すべき回数を数えた上で、
whileループをforループに変換
18. 例 - リンクリストのタスク指定
my_pointer = listhead;
#pragma omp parallel
{
OpenMP Task
#pragma omp single
{
while(my_pointer) {
#pragma omp task firstprivate(my_pointer)
{
(void) do_independent_work (my_pointer);
}
my_pointer = my_pointer->next ;
}
} // End of single - implied barrier
} // End of parallel region - implied barrier
19. ハイブリッドモデル
分散メモリ
共有メモリ
共有メモリ
0 1 P
0 1 P
M M M
M M M
20. Sun Studio Express 11/08
C/C++/Fortran 統合開発環境
http://developers.sun.com/sunstudio/
新機能評価のための先行リリース
正式リリース版は Sun Studio 12
サポートプラットフォーム
Solaris 10 01/06 以降
OpenSolaris 2008.05, 2008.11
SuSE Linux Enterprise Server 10
RedHat Enterprise Linux 5
Ubuntu 8.04, CentOS 5.1
21. 並列処理開発の支援
自動並列化と自動ベクトル化
デバッガ
パフォーマンスアナライザ
パフォーマンス上のボトルネックを検出
スレッドアナライザ
データ競合とデッドロックの検出
22. デモ
Sun Studio Express 11/08
Ubuntu 8.10 (サポート外)
以下の手順で UI の一部を日本語化 (サポート外)
Sun Studio Express “Tarfile Installer” をダウンロードして
インストール
http://developers.sun.com/sunstudio/downloads/express/
NetBeans 日本語化 zip ファイルをダウンロードして
Sun Studio のインストールディレクトリに展開
http://ja.netbeans.org/downloads/65/index.html#jazip
$ sudo mkdir -p /opt/sun
$ cd /opt/sun
$ ~/StudioExpress-lin-x86-2008-11-ii.sh --print-sla
$ sudo ~/StudioExpress-lin-x86-2008-11-ii.sh --acept-sla
$ cd /opt/sun/netbeans-6.5ss
$ sudo unzip -q ~/nb65ja-200811051154.zip
$ export PATH=/opt/sun/sunstudioceres/bin:$PATH
23. まとめ
並列化の方法
分散メモリモデル
共有メモリモデル
自動並列化 - コンパイラによる並列化
OpenMP - 可搬で比較的容易な並列化
Sun Studio Express 11/08
24. ありがとうございました
学生向け Java & Solaris 無料 E-Learning
SAI (Sun Academic Initiative)
http://blogs.sun.com/akihito/resource/e-learning-1.pdf