【12-B-4】 並列処理開発を支援するコンパイラの機能

1,869 views
1,776 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,869
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
86
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

【12-B-4】 並列処理開発を支援するコンパイラの機能

  1. 1. 並列処理開発を支援する コンパイラの機能 12-B-4 大野圭一 サン・マイクロシステムズ株式会社 東京ソフトウェア本部 製品開発統括部
  2. 2. 目次  並列化とマルチコア  並列プログラミングモデル  共有メモリモデル  スレッド  自動並列化  OpenMP  Sun Studio Express 11/08  並列処理開発支援  Linux 版を使った Ubuntu 上でのデモ
  3. 3. なぜ並列化なのか ? 並列化は最適化テクニックの一つ 目的とするところは実行速度の向上 目的のために複数のプロセッサまたはコアを使う 1コア 4コア 並列化 時 間 4コア使うことにより、コアあ たりの実行時間を1/4にする
  4. 4. 並列化とは ? 処理の順序に依存性が無いことが確実であれば、 その「実行単位」は並列である 別の言い方をすれば、それらの処理の実行順序に 意味は無いということ 機械語命令の列 プログラム行の集まり 粒 アルゴリズム 度 解決しようとしている問題
  5. 5. 並列プログラミングモデル  さまざまな並列プログラミングモデル  もっともよく知られているものとして:  (疎結合)クラスターシステム - 分散メモリ  socket (標準、低レベル)  MPI - Message Passing Interface (デファクト)  単一システム - 共有メモリ  POSIXスレッド(標準、低レベル)  自動並列化(コンパイラによって実現)  OpenMP(デファクト)
  6. 6. MPI 分散メモリモデル 0 1 M M 2 3 M M 4 5 M M クラスターシステム
  7. 7. 共有メモリモデル 共有メモリ 0 1 P M M M 単一システム
  8. 8. スレッドモデル  アプリケーションを並列化するための明 確で基本的なスレッドモデル  開発者が多くの詳細な動作を定義:  スレッドの生成と管理  スレッド間で分担する作業  スレッド間の同期処理 …  このモデルの例  Javaスレッド、POSIXスレッド、 Solarisスレッド
  9. 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. 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. 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. 12. OpenMP とは ?  C/C++、Fortranで共有メモリ型並列処理 を記述するためのデファクト  構成要素  コンパイラ指示、実行時処理、環境変数  OpenMP Architecture Review Board (ARB)が仕様を管理  2008年5月にVersion 3.0リリース  http://www.openmp.org
  13. 13. OpenMP の利点  優れたパフォーマンスと拡張性  適切に使用すれば …  デファクトであり成熟した技術  非常に多くのコンパイラでサポート 要求されるプログラミング作業が少ない  逐次処理版を維持  段階的な並列化をサポート  マルチコアアーキテクチャに適合   軽量、HWスレッド上での効果的な実行
  14. 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. 15. OpenMP 3.0  2008年5月リリース  注目すべき理由  TASKのサポート  TASKによって幅広いアプリケーションが 並列化可能に
  16. 16. タスクのコンセプト タスク指定に スレッドはプー 遭遇したスレ ルの中のタスク ッドはプール を実行 に追加 開発者はアプリケーション内でタスクを指定 実行時システムがタスクを実行
  17. 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. 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. 19. ハイブリッドモデル 分散メモリ 共有メモリ 共有メモリ 0 1 P 0 1 P M M M M M M
  20. 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. 21. 並列処理開発の支援 自動並列化と自動ベクトル化  デバッガ  パフォーマンスアナライザ   パフォーマンス上のボトルネックを検出  スレッドアナライザ  データ競合とデッドロックの検出
  22. 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. 23. まとめ  並列化の方法  分散メモリモデル  共有メモリモデル  自動並列化 - コンパイラによる並列化  OpenMP - 可搬で比較的容易な並列化  Sun Studio Express 11/08
  24. 24. ありがとうございました  学生向け Java & Solaris 無料 E-Learning SAI (Sun Academic Initiative) http://blogs.sun.com/akihito/resource/e-learning-1.pdf

×