Survey: Flexible Control Structure for Parallelism in OpenMP 田中義純 [email protected] その前に、 非常に簡単にLCR2000の報告 5月25日~27日 Rochester Univ. in NY – NYの田舎町 – 「古き良きヨーロッパ」 by田浦さん 22/? 件採択 参加者数40~50人 全体的な印象 SDSMの話が多かった – クラスタ – OpenMP 興味のある方は田中まで – Proceedings をお貸しします 閑話休題 以降の構成 既存の仕様の制限 The Workqueuing Model 実験結果 まとめ Reference Worksharing Construct Parallel construct で生成されたスレッド チームが仕事を分配して実行する #pragma omp for for (i=0; i<n; i++) process( data[i] ); #pragma omp sections { #pragma omp section process( a ); #pragma omp section process( b ); } For Construct の制限 ループの実行前に、下限・上限・増減が決まっ ていなくてはならず、途中で変更も出来ない 全てのイテレーションは独立でないといけない nodeptr list, p; … #pragma omp for for (p=list; p!=NULL; p=p->next) process( p->data ); コンパイル時エラー それでも並列化するためには nodeptr list, p; … for (p=list; p!=NULL; p=p->next) process( p->data ); この部分を標準化すればよい それでも並列化するためには nodeptr list, p; … int n = 0; for (p=list; p!=NULL; p=p->next) n++; nodeptr *q = new nodeptr[n]; int i = 0; for (p=list; p!=NULL; p=p->next) q[i++]; #pragma omp parallel for for (int i=0; i<n; i++) process( q[i] ); Sections Construct の制限 section は sections のトップレベルに書かな くてはならない #pragma omp sections { if ( node.left_leaf ) #pragma omp section process( node.left_leaf ); else if ( node.right_leaf ) #pragma omp section process( node.right_leaf ); } 現在の仕様の限界 Worksharing construct に入る前に、仕事の 絶対量が決まっていなくてはならない – for: ループの初めに決まる – sections: コンパイル時に決まる 新しいプラグマの提案 The workqueuing model – #pragma omp taskq 空のqueueを生成する – #pragma omp task queueに仕事を挿入する Workqueuing Model の例 tree list, p; … #pragma omp parallel taskq for (p=list; p!=NULL; p=p->next) { if ( p->left ) #pragma omp task traverse( p->left ); else if ( p->right ) #pragma omp task traverse( p->right ); } Workqueuing pragma の特徴 #pragma omp taskq – 他の taskq、task の内側に書くことが出来る 入れ子並列をサポート #pragma omp task – taskq の内側のどのレベルにも書くことが出来る queue task queue task task task queue task task task task task Workqueuing Model の Target Hierarchical Linked Lists Recursive Control/Data Structure e.g. Tree traversal Semantics #pragma omp taskq – Normal case: 複数のスレッドが遭遇 一台のスレッドが内部を実行し、残りのスレッドは 入り口で待っている – Nested case: 一台のスレッドが遭遇 遭遇したスレッドが実行する #pragma omp task – 対応するqueueに仕事を挿入する Syntax (1) #pragma omp taskq [ clause [ clause ] … ] – – – – – – – – – private (list) firstprivate (list) lastprivate (list) reduction (operator:list) ordered nowait If qdepth ( d ) maxqs ( n ) Syntax (2) #pragma omp task [ clause [ clause ] … ] – private (list) – firstprivate (list) Work Stealing いつ起こるか? – 今実行している taskq の仕事がなくなった時 起こり得る状況は? – taskq が入れ子状になっている時 – nowait clause が付いた時 現在の実装上の問題点 Taskq の実装 Threadprivate 変数の扱い 実験結果 4台での台数効果 4.5 4 3.5 3 IBM Compaq SGI SUN(ours) 2.5 2 1.5 1 0.5 0 Straseen FFT Queens Mutisort まとめ OpenMPに新たなプラグマを導入 今まで扱えなかった並列性を抽出 標準のAPIになるように働きかけている 感想 概念的には面白い – 我々の実装に取り入れることは可能であろう 4台以上のプロセッサでの性能の比較をし てみたい – 彼らの実装がどのくらい有効か知りたい Reference Sanjiv Shah, Grant Haab, Paul Petersen, and Joe Throop. Flexible Control Structures for Parallelism in OpenMP. In the Proceedings of First European Workshop on OpenMP EWOMP99, pages 60-70, Lund, Sweden, September 1999.
© Copyright 2025 ExpyDoc