HEXA BLOG
ヘキサブログ
プログラム
分岐しないコード
こんにちは、イワサキです。
前回に引き続きプログラミングの話題をお送りします。
昨今のCPUは10年前とは大きく変貌しています。
昔通用したアセンブラのテクニックや高速化のテクニックは
通用しなくなっていることが多いです。
たとえばPentium4に限って言えば、次のような現象が起こります。
値を8倍するコードです。
【左へ8bitシフト】
shl	eax, 3
【2の3乗=8 を加算で表現】
add	eax, eax
add	eax, eax
add	eax, eax
ぱっと見たら前者のほうが速そうに思いますが実は後者のほうが幾分高速です。![]()
初めて見ると疑いたくなるような光景ですが・・・
これはPentium4の深いパイプラインが影響しているといえます。
このようにそれぞれのCPUに得手・不得手があり、
プログラマはそれに適応していくことが求められます。
ゲームの世界でも同じく高速なプログラムを書くことは大切です。
1秒間に60枚ものCG画像を生成するわけですので、
限られた時間の中でCPUはベスト
を尽くさなければなりません。
プログラマには、より高速なコーディングが求められます。
そして今日のお題。「分岐しないコード」。
最近のCPUは流れ作業的に実行されているパイプライン仕様です。
つまり作業中に別のところへジャンプすると、
そこでCPUには作業の仕切り直し
が発生します。
たとえば32bitの中の1が立っている数を数えるとき、
普通に考えたらこう書きますよね。
int value;
int bitCount = 0;
for( int i=0; i<32; i++ ) {
  if( (value >> i) & 1 ) bitCount++;
}
これを分岐無し(branch free)で書くとこうなります。![]()
int value;
int bitCount;
value -= ( (value >>  1) & 0x55555555);
value  = (((value >>  2) & 0x33333333) + (value & 0x33333333));
value  = (((value >>  4) + value) & 0x0f0f0f0f);
value +=   (value >>  8);
value +=   (value >> 16);
bitCount = value & 0x3f;
forやifが一切ないプログラムですが、同じ結果が得られます。
アツいですね~![]()
しかも前者のループを用いた方法よりもかなり高速です。
他にもソートや数値の飽和演算などにもこういったワザが有効です。
プログラミングにはパズルを解くような面白さも兼ね備えています。
もしその面白さがゲームを作りながら体験できるとしたら幸せですネ。![]()
![]()
人生の岐路に立ったとき、分岐せず思った道をまっすぐ突き進む!
そんな熱いあなたの心はきっとプログラマー色です
熱いプログラマ来たれ!![]()
ヘキサドライブはそんなあなたを応援します。
CATEGORY
- about ヘキサ (166)
 - 部活動 (6)
 - CG (18)
 - プロジェクトマネジメント (1)
 - 研修 (5)
 - 美学 (1)
 - いいモノづくり道 (227)
 - 採用 -お役立ち情報も- (149)
 - プログラム (189)
 - デザイン (99)
 - ゲーム (273)
 - 日記 (1,104)
 - 書籍紹介 (113)
 - その他 (889)
- 就活アドバイス (20)
 - ラーメン (3)
 - ライフハック (25)
 - イベント紹介 (10)
 - 料理 (23)
 - TIPS (7)
 - 怖い話 (3)
 - サウンド (6)
 - 子育て (1)
 - 筋トレ (1)
 - NicO (3)
 - MakeS (9)
 - 商品紹介 (21)
 - アプリ紹介 (31)
 - ソフトウェア紹介 (33)
 - ガジェット紹介 (12)
 - サイト紹介 (10)
 - 研究・開発 (35)
 - 回路図 (4)
 - アナログゲーム (40)
 - 交流会 (21)
 - 報告会 (3)
 - インフラ (25)
 - グリとブラン (6)
 - カメラ (9)
 - クラフト (27)
 - 部活 (14)
 - 画伯 (15)
 - カレー (6)
 - 音楽(洋楽) (6)
 - 映画・舞台鑑賞 (43)
 - 飼育 (5)
 - いぬ (8)
 - ねこ (19)
 
 
ARCHIVE
- 2025年
 - 2024年
 - 2023年
 - 2022年
 - 2021年
 - 2020年
 - 2019年
 - 2018年
 - 2017年
 - 2016年
 - 2015年
 - 2014年
 - 2013年
 - 2012年
 - 2011年
 - 2010年
 - 2009年
 - 2008年
 - 2007年
 




