山内の演習のページ
訪問者数 941      最終更新 2012-11-11 (日) 14:16:55

並列処理を試してみる (2012-11-11)

oregano上で、OpenMPを試してみる。

  1. 自分で、区分求積(台形法)のプログラムをC言語で書き、oregano上のC言語の実行環境で実行してみよ。
    • 例として、半径1の円の1/4の面積を求めてみよう。区間0..1について、式 y=sqrt(1-(x*x)) を積分することを考える。sqrtは平方根関数。x*xはxの2乗。
    • C言語の実行は、C言語のソースファイルxxx.cを作る(xxxは任意の名前)。gccコマンドでコンパイルする。具体的には gcc -o xxx xxx.c -lm ぐらいでよかろう。できた実行ファイルxxxを実行する。具体的には ./xxx とすればよい。なお、"./"の部分の意味について、説明できること。
    • 正しく計算できているかどうかは、積分計算の結果を見るとある程度分る。1/4の円を積分したのであれば、結果を4倍すると円周率πになるはずである。π=3.1415926535897932384626...が得られるだろうか?
      区分求積法ではまず、積分したい関数と台形近似の面積の差が誤差になる。だから、台形の高さhを小さくすればするほど誤差が小さくなるはずである。hを小さくするには、区間0..1の分割数Nを大きくする。Nを大きくすると計算時間が長くなる。
      Nをどんどん大きくして、誤差が小さくなるかどうか試してみよ。たとえばN=1,000,000,000とか。Nを整数(int)型とすると、2の31乗まで書けるはずで、これはだいたい10の9乗、つまり9桁分ぐらいに当るはず。oreganoは64ビットモードで動いているので、もしかすると2の63乗まで書けているかもしれない。
      forループのカウントは整数でするべきである。(さもないと、並列分割できない)積分値の計算やそれに伴うhの値などは倍精度浮動小数double型で計算すべきである。double型だと有効数字は十進で何桁あるだろうか?
    • 計時したい。いろいろなやり方があるが(OSに依存するもの、しないもの)ここではUNIX/Linux上のgettimeofday関数を使ってみよう。gettimeofdayについてはネットを検索して使い方を探せ。
      プログラムの実行時間を測定するには、開始時点の時刻と終了時点の時刻を計時し、差分を取ればよい。gettimeofdayは秒部分の整数値とマイクロ秒部分の整数値が取れるので、工夫して(マイクロ秒単位の)時間の差分を計算せよ。(もしマイクロ秒部分の差が負だとどうなるか、よく考えよ)
      もし差がゼロだったら、実行時間は1マイクロ秒以下ということになるだろう。こういうときはどうしたらいいだろうか?
      また、gettimeofdayから得られる時間はどういうものかを、整理して置け。
  1. OpenMPを用いて並列実行してみよ。
    • 基本的にOpenMPでforループを並列化する。OpenMPのできることを(ネットで検索して)理解せよ。
    • OpenMPのソースの書き方は、教科書で見るか、ネットで検索せよ。#pragma openmp ..... を理解せよ。
    • OpenMPの実行は、.宗璽好侫.ぅyyy.cを作る。基本的にはC言語のプログラムである。gccコマンドでコンパイルする。このとき、gcc -o yyy yyy.c -lm -fopenmp のように、最後に "-fopenmp" を付けることで、OpenMPとしてコンパイルされる。できた実行ファイルyyyを実行する。上と同じで、./yyy とすればよい。
  2. 処理時間を測定し、8並列が実行されているかを確認せよ。
    • OpenMPの最大並列度は、何も指定しなければプロセッサの数になるが、#pragma openmp ... の節の1つとして num_threads(4) を書くと(但し4はスレッド数)最大スレッド数が4になる。これによってスレッド数を1スレッドから10スレッドまで変化させ、並列加速率(並列時処理速度/単一時処理速度、つまり、単一時処理時間/並列時処理時間)をグラフ化せよ。
    • 並列加速率がプロセッサ数にならない場合(つまり、十分な並列性が得られない場合)を考える。どういう状況だと、並列加速率がプロセッサ数にならないのか? 1つに直列部分と並列部分の割合の問題がある。また、直列部分ができる理由を考えると、1つには原理的に(アルゴリズム的に)直列部分がある場合や、2つには正しく処理するために共有変数をロックして情報のインテグリティ(統一性)を守らなければならないので直列部ができてしまう場合、などを思いつく。いろいろと調べてみよ。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-11-11 (日) 14:16:55 (1776d)