パイプラインとストールと2

昨日の続き。

んで、CPUの内部は分担作業を順番にこなすことで高速化をしていて、
それをパイプラインというわけだ。

ところで、命令には色々あって条件によって分岐する命令もある。

昨日書いた、↓は、順序よくこなしている物の、1~3はある意味で先読みをして先行着手している状態だ。

1,メモリーから命令の読み出し
2,命令の解釈
3,命令に従って別のメモリーからデータの読み出し
4,読み出した命令の実行
5,実行結果をメモリーに書き出し

と言うことは、先行する命令が4で実行された結果、
先読みしていた1~3が無駄になる。
これを制御ストールという。

または、先行する命令の結果を受けて後続の命令が計算するためには、
先行する命令が5の処理を終えるまで、後続の命令は3の処理を待たないといけない。

これがデータストールという。

このように、パイプライン処理というのは非常に強力な武器ではある物の、
どこか一部で問題が生じるとトタンに遅延が発生するガラス細工のような物だ。

Pentium4等は、このパイプラインを数十段にする事で高速化をしたけど、
逆に、ストールが起きないプログラム作りをしないとパフォーマンスがかえって低下すると言うこととなる。
それが、Pentium4の悪評に繋がったわけだ。

また、このパイプラインとストールの話はなにもCPUに限った話では無く、
スケジュールをパイプライン化すると、
1つの作業の遅延が全体の遅延となるワケだ。

くわばらくわばら。

パイプライン処理とストール

パイプラインというのは要するに流れ作業でCPUの内部で
たとえば、CPUの内部動作が、以下の様な感じだったとする。

1,メモリーから命令の読み出し
2,命令の解釈
3,命令に従って別のメモリーからデータの読み出し
4,読み出した命令の実行
5,実行結果をメモリーに書き出し

これを、バカ正直に実行すると、1つの命令を実行するのに5ステップかかる。

なので、1~5の機能を持った装置を並べて、
・1番目の命令を「1,」の装置に渡す。
・前の結果を「2,」の装置に渡し、「1,」の装置は2番目の命令を読み出す
    :
といった感じに順番で動作させれば、見かけ上1ステップで1つの命令が実行できると言うのが、パイプライン処理。

いや、今日はこれを説明したいんじゃ無かったけど、
まぁいいや、今日はこの辺で、明日はこの話の続きでも。

Eclipseでhtml編集時にincludeしたい。

最近、コード書いてないなぁ・・・
と思いつつ、EclipseでWebページの編集をしてみている。

ところで、
header.html
main1.html
main2.html
とか用意しておいたら、
main1にもmain2にもHTMLが挿入されて、
headerを更新したら、都度、それが適用されるような
Eclipseのプラグインってないですかね?

こんな事のためにphpを使うのも何か違う気がするし。
市販のHTMLエディターだとそういう機能を持っている物もあるのですが。

単純に、いつも同じ無い様を入れるだけならスニペット機能でいけるけど、
それを、1カ所変えたら、スニペット先の物が全部変わるような、
そんな機能が、Eclipseのプラグインエディターで持っているのがあれば情報下さい。

病院でのOoO

風邪でdone中。
と言うわけで、風邪で病院に行ったのですが、
あいにくと、かかりつけはお休みだったので、行ったことが無いところに言ったわけです。

したらば、こんな張り紙が:

重症な患者さんや、薬の処方のための来院、診察内容などで
呼ばれる順番が前後することがあります。
予めご了承下さい。

うん、まさしくOoO。

OoOとはOut of Orderの略で指定された順番でプログラムを実行しないという、
コンピューターの最適化手法の一つ。
Intel系のCPUだとPentiumProから搭載されている。

病院でたとえると、
・皮膚科と内科の診察が出来る医院長先生
・内科が診察できる、平医者
の2名が居たとする。

そこに、
1,皮膚科患者A
2,皮膚科患者B
3,内科患者C
4,内科患者D
と病院に来たら、皮膚科患者Bを飛ばして、内科患者Cを診察した方が、
皮膚科患者Bさんの診察時間は変わらず、内科患者CさんDさんの診察時間が早まる。

全体として効率が上がるわけだ。

まぁ、とはいえ、結構、そういう細かいことで、文句を言う患者さんはいるんだけどね。(遠い目・・・
#そこまで元気なら、病院来るなとも言いたい。

余談だけど、「Pentium」は、
「PentiumPro」と「Pentium with MMX Technology」の2系統進化をして
前者はOoOを搭載しm後者はMMXを搭載したわけだ。
そして、その次の世代「Pentium II」はこの2つの機能を搭載したという、系譜がある。
いや、ホントにどうでもいい話だけど。

CPUを効率よく使うプログラムの使い方(2000年頃の書き方)

今から10年以上まえのこと。
当時、自分はとあるゲームのプログラムを作っていました。

当時のWindowsゲームのプログラムは、
まぁ、いろいろな方法があったのですが、
画面に対してそれなりに動きのあるプログラムとか、
内部での演算が色々生じるプログラムの場合には、
2パターンほどの書き方に分かれます。

1つは、タイマーイベントを定期的に飛ばして、
タイマーイベント内で演算処理とか描画処理をする方法。
CPUがひ弱なPCではCPU占有率がうなぎ登りですが、
そこそこのスペックのPCなら、CPU占有率は逆に落ちてくれます。
ただ、タイマーイベントは優先順位が低いので、
スムーズな処理が出来ないというのが難点です。
※マルチメディアタイマーを使えば、タイムラグが少なく(と言っても10msec程度のラグはある)、処理が行えるけれど、
 今度は、色々と制限が出てくる。

自分がとったのは別の方法で、
通常、自分のプログラムにOSからイベントが飛んでこなかったら、
イベントが来るまで休ませるプログラムを書きますが、
あえて、別スレッドを立てて、そのスレッドでゲームのプログラムぶん回し、
そのスレッド内で他のプログラムへのイベントなどが発生したことを検知したら、
そちらのプログラムにCPUをお裾分けする方式。

この方式は、当時の音楽再生ソフトとかでも多用されていた方法で、CPUの処理能力が十分あれば、
自分が必要としているタイミングがmsec以下のタイミングで制御できる画期的な方法です。
※CPU能力が少なくても、それなりに動きます。

が!

デバッガーから
「CPU100%になるプログラムは製品としておかしい!」
という、ある意味至極もっともなご意見を頂いたわけです。

いや、それで正しいんだよと、説明しようにも、
そこそこPCに詳しいデバッガーさんが理解できなかった時点で
お客様への理解もされないだろうなと言うことで、
前者の方式になるようにプログラムの組み直しをしました。

で!何が言いたいかというと、
あれやれ!これやれ!と指示を受けて作業する仕事と、
今これに集中しないと!で偶にインタラプトされる仕事と、
仕事にも色々あるなぁということです。

効率は後者の方が良いけれど、自分の処理能力が追いつかないと、
インタラプトされたことに気がつかず怖いなーと

ImTiredException


int main() {
 int hitpoint = 100;
 while(hitpoint) {
  try{
   dowork();
   hitpoint--;
   if (hitpoint == 0) {
    throw new ImTiredException();
    Sleep(24*60*60*1000);
   }
  } catch (Exception e) {
   hitpoint--;//もっと疲れろ //こう書くと何故か動く
  }
 }
}

いや、何となく。

C#のDelegateとは

先日の記事で C#のdelegateについてちらっと触れた。

C#のDelegateというのは、簡単に説明すると、C/C++での関数ポインタで、
イベントハンドラなどに利用される。

ただ、C/C++の関数ポインターとは大きく異なる点(拡張された点)が少なくとも2つあり、
まともに使いこなすならこの2点を抑えないといけない。

1つめは、インスタンスメソッドを参照できる点。
C++ではstaticなメソッドしか参照できなかったので、
第1引数にthisを渡すなどして回避していた物が割と柔軟に対応できます。

2つめは、複数のメソッドを割り当てることが出来る点。
C/C++はあくまでもプログラムの場所を指し示す物、
もっと低レベルで言うならば、指定された関数のメモリー上のアドレスを指定していたわけですが、
そのため、複数の関数を関数ポインターに渡すことは出来ませんでした。
Delegateは、複数のメソッドを指定できる画期的な機能があります。

この2点が、関数ポインターとの大きな違い。

慣れてくるとかなり便利。

遠隔操作の容疑者曰く「C#は使えない」

また、遠隔操作事件ネタ。

高木ひろみちゅ先生によれば、容疑者は

②「自分はウイルス作成に使われた言語を使うことができない」

http://togetter.com/li/456852
と主張しているそうな。

Ω ΩΩΩ<ナ・ナンダッテー 確か、件の事件はC#で書かれていたワケだけど、 C#を容疑者が使えるという事の立証責任が警察に生じたわけだ。 なかなか面白い展開になってきた。 もっとも、C#を使えないことを証明するのは難しい(悪魔の証明)けど、 C#を使える証明は意外と簡単。 C/C++/Javaなど、C言語の流れを持った言語を知っていればC#は使える。 ただ、今回の騒動のプログラムがC#のDelegate機能とかを使っていたりすると、 CやC++の関数ポインター的な知識が必要で、 C#を専門に学習したり、CやC++をかなり熟知した人間じゃないといけないなど、 問題のプログラムの内容に応じて、合理的疑いを越えるための、証明をするハードルが変わる。 なんにせよ、どんどん面白くなってきた。 ここで、真犯人を名乗る人間が、 「マテ、それは誤認逮捕だ」 と、メールでも送ってきたらさらに面白いことになるけど、 さすがにそれは無いかなぁ・・・

プログラマーにぴったりな稼げる副業は?

表題の記事が/.Jに載ってた
http://developers.slashdot.jp/story/13/02/13/0848210/

なんだろうね?

そういえば、先日は、自社の仕事を外部に(自分が個人事業主として)勝手に委託して、
自分はその管理業務をしていただけという人が居たっけ。
しかも成果物はすこぶる良かったとか。

もう、上級のプロマネになれよと言う感じがする。

それはさておき、Blogのアフィリエイトも、
よほどのアクセス数を望まないと、雀の涙だし。
※当Blogのアフィリエイト代は、ドメイン代とサーバー代の合計よりは少ないですorz

たまにプログラム作っても、美味しい社会貢献ライセンスとか、
MITライセンスで公開しているから、お金にならないし。

そういえば、仕事で本を2冊ぐらい書いたな(改訂版を入れると3冊)。
それをプライベートでやれば儲かるかも知れないけど、
逆に大きな赤字になるリスクもあるので、
給与が保証されている中でやった方が楽だよなー

過去には、土日限定で、
近所のパソコンサポートをお小遣い貰いながらやったり、
書類の代打ちをやったりしていたけど、
この年だと、ご近所さんから小遣い貰うのも変だし。

なんだろうね?
プログラマーにぴったりな稼げる副業って。

自作PC保有者はITに精通しているらしい

遠隔操作事件の件で面白いニュースが:
http://www.fnn-news.com/news/headlines/articles/CONN00240346.html

以下、本記事の作成に当たっての引用:

パソコンの遠隔操作事件で、逮捕された男の自宅から押収されたパソコンに自作のものが含まれていたことがわかり、
警視庁などは、IT技術に精通した男が、遠隔操作ウイルスも作成したとみて調べている。
<略>4台のパソコンを押収したが、このうちの2台は、自分で作ったものだったという。

引用終わり。

自作パソコンを使っている人は、IT技術に精通して、ウイルス作成とか出来るらしい。

じゃあ何か?自作PCを5台保有していて、
しかも、4台が現役稼働中の自分はスーパーハッカーなのだろうか?
そんなことは無いよね?

ぶっちゃけ、自作パソコンなんて、店の人に任せて部品を買えば、
プラモデルよりもずっと簡単だし。

基本的には
・電源(ギークじゃなければ普通は筐体とセットで買う)
・マザーボード
・CPU
・メモリー
・キーボード
・マウス
・HDD
・光学ドライブ
を繋がる端子に繋がるケーブルをホイホイ指していけば組み立ては終わる。
OSのインストールなんて、DISCを光学ドライブに入れて、シリアルキーを入れる部分以外は、
次へと進んでいくだけで終わる。

むしろ、真のギークは、自作パソコンなんかに時間をかけるぐらいならば、
DELLとかあたりのBTOで注文して、ソフトと戯れることに注力するはずだ。

これが、オライリーの本をほとんど揃えていて
読み終わった木琴代わりにしてPCから制御して遊んでいた(↓)とか言われれば、
ITに精通していると言われても納得するけど、
自作PCがあるだけでITに精通していると言われても・・・ねぇ。


※お台場の日本科学未来館で一時期展示されていたオライリー木琴