連続系アルゴリズム演習 第2回 OpenMPによる課題.

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
模擬国内予選2013 Problem F テトラ姫のパズル 原案:須藤 解答:大友、須藤 解説:須藤.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
第3回 並列計算機のアーキテクチャと 並列処理の実際
第2回 プロセス管理 ジョブ、プロセスとは? プロセスの状態遷移 プロセス制御ブロック スケジューリング.
クラスタの構成技術と クラスタによる並列処理
プログラミング基礎I(再) 山元進.
全体ミーティング (4/25) 村田雅之.
PCクラスタにおける2個体分散遺伝的アルゴリズムの高速化
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとプログラミング (Algorithms and Programming)
基礎プログラミングおよび演習 第9回
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
オペレーティングシステムJ/K 2004年10月7日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
C言語講座 第4回 ポインタ.
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング論 II 電卓,逆ポーランド記法電卓
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
アルゴリズムとデータ構造 補足資料10-2 「nクイーン」
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
京都大学大学院医学研究科 画像応用治療学・放射線腫瘍学 石原 佳知
C言語講座 第3回 ポインタ、配列.
プログラミング2 関数
C言語でスレッド (Pthread) 2007年1月11日 海谷 治彦.
独立大学法人・電気通信大学 大学院情報システム学研究科 情報ネットワーク学専攻・並列処理学講座
マルチスレッド処理 マルチプロセス処理について
MPIとOpenMPを用いた Nクイーン問題の並列化
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング 4 記憶の割り付け.
共有メモリマシン上での 並列計算プログラミング
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
再帰的手続き.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
VMが利用可能なCPU数の変化に対応した 並列アプリケーション実行の最適化
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
「マイグレーションを支援する分散集合オブジェクト」
第4回 メモリ管理 主記憶(メインメモリ)の管理 固定区画方式と可変区画方式 空き領域の管理 スワッピング.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
「マイグレーションを支援する分散集合オブジェクト」
情報処理Ⅱ 2005年1月25日(火) レポート課題2の解説.
ネットワーク・プログラミング デバイスドライバと環境変数.
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
プログラミング演習I 2003年6月11日(第9回) 木村巌.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
3.1 シューティングゲームの当たり判定 当たったら死亡.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習I 補講用課題
プログラミング 2 静的変数.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

連続系アルゴリズム演習 第2回 OpenMPによる課題

スレッドモデル プロセス 各スレッドはそれぞれ 独立に実行される ただし、共有変数のみ どのスレッドからも アクセス可能 共有変数 スレッド0 スレッド1 スレッド2 変数 変数 変数 最近のプログラミング言語は、 言語レベルで スレッドを実装している

なぜスレッドか プロセスの立ち上げはコストがかかる プロセス間通信はめんどくさい Linuxだとfork(); WindowsだとCreateProcess(); メモリ領域を割り当てて、コピーして、プロセスIDを割り当てて....etc. プロセス間通信はめんどくさい スレッドだと共有変数を使えばOK 別の手法 pipe socket (MPI)

OpenMPの目的 プロセス スレッドごとに CPUを割り当てる 共有変数 CPUの作業分割を プログラマができる! CPU1 CPU2 プロセッサを割り当てる 機構はない (スレッドを作るだけ) スレッドを<pthread.h>よりは書きやすく 環境によらずに言語実装としたのがOpenMP

OpenMPの使い方1 #include <omp.h> int main(){ #pragma omp parallel { printf("%d\n", omp_get_threads_num()); } omp.hをincludeする この部分が並列化 omp.hで定義されてる関数

OpenMPの使い方2 プロセス #include <omp.h> int main(){ int common_var; #pragma omp parallel { int k; } int common_var; スレッド0 スレッド1 スレッド2 int k; int k; int k; 定義する場所で共有変数か スレッド私有変数かが決まる

OpnMPの使い方3 各スレッドで同期を取る必要性 #pragma omp barrier MPIの場合と同じ 全てのスレッドが揃うまで待つ デバッグをするのにも必須

OpenMPの使い方4 共有変数の書き換え いつ書き変わるか分からない 必ず書き換えるには あんまり共有変数を使うのはよろしくない #pragma omp parallelの最初と終わり #pragma omp forの最後 #pragma omp flush #pragma omp barrier などなど あんまり共有変数を使うのはよろしくない 読んでもいいが、書き換えはまずい 読む場合も、同時に読もうとすると片方が待つ

OpenMPの使い方5 Lock機構がある これもOSでやったはず omp_lock_tという型の変数を共有変数で作る int main(){ omp_lock_t lock; omp_init_lock(&lock); int k = 0; #pragma omp parallel { omp_set_lock(&lock); k++; printf("%d\n", k); omp_unset_lock(&lock); } Lock変数の宣言と初期化 この間は 排他的に処理される =速くはならない

OpenMPの使い方6 #pragma omp parallel for schedule(option) ループ処理で最適化する手法 static, dynamic, guided, runtime... 自分で調べてみてください #pragma omp parallel for schedule(dynamic) for(i = 0; i < 100; i++){ function(i); } 余っているプロセッサが順次投入される

その他 もう少し細かいいろいろなことは、須田先生の解説を読むこと Web上にはほかにも資料がある OpenMPの書籍はあんまりない これ以外のプラグマが高速化などには必要かも Web上にはほかにも資料がある OpenMPで検索してくださいな OpenMPの書籍はあんまりない ギリギリ石川先生の本があったりする 後はFortranとか

課題 OpenMPを用いてN-queens問題を解くプログラムを実装せよ nの値を変えて時間を測定すること n×nの升目の場合に、解の個数を調べる 事前に準備とかしないこと! それぞれの解を出力する必要は特にない nの値を変えて時間を測定すること そんなにたくさんのnを使う必要は別にない 適度に時間のかかる3つくらいの値を使えば良い p(スレッド数)を変えて時間を測定すること 並列化効率などの考察をすること(一番重要)

N-Queens Problem チェスのQueenを配置する Queen同士が攻撃できない配置にする 将棋で言うところの飛車+角 Queen同士が攻撃できない配置にする n×nの升目に、n個のQueenを配置する 何通りの配置がありうるか

N-Queens Problem 置ける場所 が減る 左上に置く 右から2番目 上から2番目に置く 4×4の升目に、 3つしか置けなかった 失敗

N-Queens Problem n=4の時の解 n=5の時 10種類 n=6の時 or 4種類 n=7の時 2種類 40種類

解のリスト n solution 1 2 3 4 5 10 6 7 40 8 92 9 352 724 11 2680 n solution 3 4 5 10 6 7 40 8 92 9 352 724 11 2680 n solution 12 14200 13 73712 14 365596 15 2279184 16 14772512 17 95815104 18 666090624 19 4968057848 20 39029188884 21 314666222712 22 2691008701644

参考 めちゃくちゃ遅いプログラムを置いておくので、それを使っても良い Webにもいくつか転がっているので参考にしても良い ただし、ちゃんとプロセッサを複数使って速くすること 自分で書いた方が普通は速くなる O(n!)で作ってある Webにもいくつか転がっているので参考にしても良い OpenMPを使って実装してあるものはダメ レポートにはそのことを明記すること 盗作はやめて

高速化のためのヒント 1プロセッサでの高速化 並列性能を上げる 盤面の対称性を利用する bit演算にする 関数呼び出しをloopにする 通信はあんまりさせない 終わったプロセッサには次の仕事を与える 最初からどのプロセッサがどの作業をするかを確定させない 動的に作業割り当てをする (Bounded Buffer) omp for