プロファイリング

目次 解答例(ないかも)

最後の更新は次の時刻以降のはず.Time-stamp: "2003/03/25 Tue 10:24 hig"


課題27_01(ta141) mtools で Linux から DOSフロッピーにファイルを移す

これまで計算科学実習で作ったプログラムを持ってきたフロッピーディスクに 保存して持って帰ろう. 特別研究などで必要になったら, Windows/Linux で使えます. ただし, 改行コードが Unix (LF)のままなので, Windowss のメモ帳などではうまく開けないかもしれません. Meadow や terapad を使えば大丈夫です.

Windows 上での Java や C の使い方は, この文書 が多少は参考になるかもしれません.

持って帰りたいものは .emacs, *.gp, *.java, *.c, *.h, Makefile* です. 本来は 課題15_01 でやった方法でやれればいいのですが, どうも長いファイルネームの場合はうまく行かないようなので, 次のような mtools を使った方法で行くことにします(読み出し方法は同じで大丈夫です). Mtools の使い方は次のリンクなどを参照.

  1. フロッピーをドライブにセットして, 次のコマンドでフォーマットする. a: がフロッピーを意味する. 普通の Unix の path 指定方法の枠内には収まらない記法.
    s1609h017% fdformat /dev/fd0H1440 #物理フォーマット
    s1609h017% mformat a: #論理フォーマット
  2. ディレクトリをつくる. mmd は mkdir に相当するコマンド.
    s1609h017% mmd a:/cs1 a:/cs2
    s1609h017% mmd a:/cs2/rw a:/cs2/cp a:/cs2/life
  3. ファイルをコピーする. mcopy が cp に相当するコマンド. 推奨したディレクトリ構造になっていれば次でよいはず.
    s1609h017% cd ~/cs1; mcopy *.java *.gp a:/cs1
    s1609h017% cd ~/cs2/rw; mcopy *.h *.c Makefile* a:/cs2/rw
    s1609h017% cd ~/cs2/cp; mcopy *.h *.c Makefile* a:/cs2/cp
    s1609h017% cd ~/cs2/life; mcopy *.h *.c Makefile* a:/cs2/life
    s1609h017% cd ; mcopy .emacs a:/
    s1609h017% cd ; mcopy .emacs a:/dot.emacs
    異なるディレクトリ構造になっている場合, 落ち着いて自分で考えるか, 相談してね.
  4. うまくいったかチェックする. mdir が ls に相当するコマンド.
    s1609h017% mdir a:/cs1 a:/cs2/rw a:/cs2/life a:/cs2/cp
  5. TA の方のチェックを受けたあと, フロッピーディスクをイジェクトする
  6. ここでは, 日本語コードの変換は行いませんでした. 家で, EUC + LF改行 のファイルを扱える TeraPad などのエディタを使うならそれでよいのですが, 秀丸やメモ帳を使う場合には, コピー前に Linux 上であらかじめ変換しておく必要があります. それには,

    s1609h017% nkf -s -c File_Linux > File_Windows
    とします. 逆に, Windows で作ったファイルを家から持ってきた場合には (Linux へのコピー後に)
    s1609h017% nkf -e -d File_Windows  > File_Linux
    
    とします.

    また, この作業は, Windows 上でも qkcnkf をインストールすれば行えます. Linux で扱うには文字コードを EUC, 改行を LFとし, Windows で扱うには文字コードを SJIS, 改行を CR+LFとすればよい.

課題27_02(ta142)プロファイリング

プログラムの中のどの部分が何回実行され, どのくらいの時間を消費しているかを調べてみよう.

実験1

自分のプログラムprogram(たとえば epidemic3)を,

s1609h017% time program
# あるいは
s1609h017% /usr/bin/time program
として実行して, 消費される時間をチェックしよう. コンパイルオプションとして, -O2 を指定したときと, 指定しなかったときで, 何倍になるかを答えよう. u(ser), s(ystem), (elapsed) の意味を TA の人々に説明できるようにしよう.

コンパイルオプションは, Makefile の CFLAGS の部分に追加すればよい.

実験2

プログラムepidemic3を, コンパイルオプション -pg つきでコンパイル, リンクし直そう.

これは, Makefile の中で,

CFLAGS=-pg
LDFLAGS=-pg -L$(LIBDIR)
として, make すればよい.

実際には

s1609h017% cc -pg epidemic3.c 
s1609h017% cc -pg random.c
s1609h017% cc -pg -o epidemic3 epidemic3.o random.o -lm
が行われる.

次に,

s1609h017% ./epidemic3
として実行すると, カレントディレクトリに gmon.out というファイルができる. これを, プロファイラ(profiler)にかける.
s1609h017% gprof epidemic3 > result

ファイル result の中を見て, 次の問いに答えよう.


Copyright © 2002,2003 Saburo Higuchi. All rights reserved.
Saburo HIGUCHI, hig mail address