<HEAD>
<TITLE>Optimizing</TITLE>
</HEAD>

<BODY BACKGROUND="../Image/Back2.GIF"
	TEXT="#E0E0E0"
	BGCOLOR="#191919"
	LINK="#90D0FF"
	VLINK="#4080D0"
	ALINK="#0000FF">

<BASEFONT SIZE="3" FACE="ＭＳ Ｐ明朝">

<BR>
<CENTER>
<FONT SIZE="7" COLOR="80FF80"><I>Optimizing</I></FONT>
<P>
<P>
</CENTER>

<CENTER>
<IMG SRC="../Image/Bar2.gif" ALT "-------------------------------------------" width=100% height="8">
</CENTER>
<P>

<P>
<DL>
<DT>
<FONT SIZE="3" COLOR="#FFFF80"><B><I>98/05/12（火）　</I></B></FONT>
<FONT SIZE="4"><B>− Optimizing − 最適化のノウハウの誤解</B></FONT>
<P>
<DD>
　この前、アセンブリを使っての最適化について、
ちょっと誤解を招く（勘違いされる可能性のある？）記述を見付けた。
プログラムの経験のある人なら変な誤解をすることはないだろうが、
初心者ではあの記事を何も考えずに鵜呑みにし、本末転倒な最適化をする人
がいないとも限らないので、ここで取り上げることにした。
<P>
　さて、その記述によれば、<FONT COLOR ="#FF9090">
「速度を上げるためにはアセンブリで記述し、
とにかく１クロックでも削れる所があればすべて削って速くする」</FONT>
とのことであった。
<BR>
　もちろん、できるだけ<FONT COLOR ="#FF9090">
クロック数を少なくしてスピードを稼ぐ</FONT>という点では別に間違ってはいない。
問題は、「アセンブリでコーディングし、とにかく
クロック数を少しでも減らせるところがあれば、すべて減らしていくように
プログラムすれば、スーパー最適化できる」
というようなニュアンスを含む<FONT COLOR ="#FF9090">
安直な書き方</FONT>だったことである。
しかもほとんどそれしか書かれていない。
特に<FONT COLOR ="#FF9090">
プログラムの初心者があの記事を鵜呑みにする</FONT>と、
単純に書いてある通りに実践し、誤った最適化をする可能性がある。
<BR>
　例えば、<FONT COLOR ="#FF9090">
10回ループの内側に1000回ループのような二重ループ処理</FONT>
がある場合、
<FONT COLOR ="#FF9090">
10回ループの部分を10クロック削るために、内側の1000回ループ内を1クロック
犠牲にしようなどと考えてしまう</FONT>かもしれない。
<BR>
　記事の書き方が、そもそも<FONT COLOR ="#FF9090">
目先のクロック数のみにこだわっており、マクロ的な視点を一切無視している
</FONT>のである。
<FONT COLOR ="#FF9090">あたかもそれが全てであるかのように。</FONT>
しかもそこに例として載っていた最適化は、
アセンブリをある程度使える人なら誰でも考えられるようなレベルのものである。
<BR>
　上の例では、まず10回ループの部分の重みと、その内側の1000回ループ内の
重みの差を知り、その上で全体のパフォーマンスが向上するように
最適化すべきであろう。
当然<FONT COLOR ="#FF9090">
10回ループの部分の１クロックと、その内側の1000回ループの部分の１クロックでは、
重みに1000倍の差がある</FONT>
ことを考慮しなければ意味がない。
<P>
　具体的な例を挙げよう。
<FONT COLOR ="#FF9090">100MHzのマシン</FONT>で、例えば
<FONT COLOR ="#FF9090">100FPSのフレームレートが出ている</FONT>ゲームを
作成中だとする。
とりあえずディスプレイのリフレッシュレートとの同期などは考慮に入れないことに
しよう。
<BR>
　このメインのループ内全体のクロック数を計算すると、
<P>
<CENTER>例えば<FONT COLOR ="#FF9090">100MHz / 100FPS = 100万クロック</FONT>
</CENTER>
<P>
この場合だと、<FONT COLOR ="#FF9090">
メインのループ内の最も外側の部分で100クロック削っても
無意味</FONT>である。
<FONT COLOR ="#FF9090">
全体のパフォーマンスは0.01%程度しか変わらない。</FONT>時間の無駄。
<BR>
　しかし、このメインループの中に100回ループの二重ループ（100回を
100回繰り返す）があったとすると、<FONT COLOR ="#FF9090">
最も内側で10クロック削ることは非常に有意義</FONT>である。
<FONT COLOR ="#FF9090">
全体のパフォーマンスは単純計算で10%以上向上する</FONT>からだ。
実際にはこうも単純にはいかないが...。
<BR>
　<FONT COLOR ="#FF9090">
「こんなことは極当然じゃないか」</FONT>と感じる方は多いだろう。
しかし、まったくの初心者で、しかも<FONT COLOR ="#FF9090">
与えられた知識を鵜呑みにする人</FONT>がいるならば、
あまり笑っていられないのもまた事実なのである。
<P>
　さて、ここから先は少々余談。
<BR>
　<FONT COLOR ="#FF9090">現在のコンピュータのアーキテクチャは複雑</FONT>である。
10年前なら、自分が組むプログラムがどのくらいのパフォーマンスであるのか、
<FONT COLOR ="#FF9090">コーディング中にしっかり把握できた</FONT>。
しかし今はそうもいかない。
<FONT COLOR ="#FF9090">
メモリキャッシュ、命令キャッシュ、パイプライン、分岐予測等々、
クロック数以外にもパフォーマンスを大きく左右し</FONT>、それでいて
<FONT COLOR ="#FF9090">
動きを完全に把握することなどできない</FONT>ような要因は数え切れないほどある。
<BR>
　昔のように、ほぼ<FONT COLOR ="#FF9090">
クロック数だけで判断することはもうできない</FONT>ため、
本当に有効な最適化も、ますます難しくなることだろう。
<P>
　いやあしかし、最近のマシンの速いこと速いこと。
<FONT COLOR ="#FF9090">Pentium</FONT>も、
浮動小数点の乗算なら3クロックで終了する。
私が昔（と言っても数年前まで現役で）使っていた
マシン（<FONT COLOR ="#FF9090">CPU V30 8MHz</FONT>）など、
<FONT COLOR ="#FF9090">整数の乗算でさえ100クロックくらい</FONT>かかった。
<BR>
　何が凄いって、<FONT COLOR ="#FF9090">クロック周波数だけでも30倍ほど差がある
</FONT>のだから、単純に考えるなら
<FONT COLOR ="#FF9090">最近のCPUの浮動小数点の乗算</FONT>は、
<FONT COLOR ="#FF9090">昔のCPUの整数の乗算</FONT>より
<FONT COLOR ="#FF9090">1000倍くらい速い</FONT>.....................................................をいをい(^^;;
</DL>

<!-- Signature -->
<FONT SIZE="3" FACE="ＭＳ Ｐ明朝">

<CENTER>
<IMG SRC="../Image/Bar2.gif" ALT "-------------------------------------------" width=90% height="16">
</CENTER>

<UL>
	<A HREF="index.html"><B><I>Masa's Column</I></B>に戻る</A>

	<TABLE>
	<TR>
	<TD>
	<A HREF="../index.html"><IMG SRC="../Image/MasaPlate.gif" BORDER="0" WIDTH="112" HEIGHT="48"></A>
	</TD>
	<TD><A HREF="../index.html">ホームページに戻る</A></TD>
	</TR>
	</TABLE>

	本ページの御意見・御感想は<BR>
<B>
<ADDRESS>
	<A HREF="mailto:g93088@isc.chubu.ac.jp">
		<I>E-Mail: g93088@isc.chubu.ac.jp</I></A>
</ADDRESS>
</B></UL>

</FONT>
<!-- Signature -->

</BODY>
