HEXA BLOG
ヘキサブログ
プログラム
分岐しないコード part2
こんにちはイワサキです
今回もコーディングテクニックを紹介してみたいと思います。
以前に分岐しないコードについて書いてみましたが、今回も別のシチュエーションでの
お話をしてみたいと思います。
たとえば次のようなif文のCプログラムがあったとします。
signed int a, b;
signed int c;
if( a < b ) {
c = a;
} else {
c = b;
}
これをx86系の通常のアセンブルコードで書くと次のようになります。
mov eax, [a]
mov ebx, [b]
cmp eax, ebx
jge l1 // 分岐
l0:
mov ecx, eax
jmp l2 // 分岐
l1:
mov ecx, ebx
l2:
mov [c], ecx
ここから分岐を一回無くすこともできますが、現状では2回とします。
動きを図で表すとこのような具合ですね。
そして下記のコードが分岐を無くした最適化コードです。
mov eax, [a]
mov ebx, [b]
cmp eax, ebx
sbb ecx, ecx
// ↑ここで0xffffffff または 0x00000000のマスクが生成できる
and eax, ecx // eax = a & mask
not ecx
and ebx, ecx // ebx = b & ~mask
or ebx, eax // ebx = (a & mask) | (b & ~mask)
mov [c], ebx
マスクを生成してそれによって選択する方法です。
最近ではこういった選択実行をするものや
数値入れ替えを行なう命令がCPUに搭載されていることが多いですから、
さらに良い実行コードを出力できることになります。
多少コードが長くなっても分岐しないコードは安定して
コードが実行されるため高速実行できることが多いです。
もとの分岐するコードと比べて何倍・何十倍も実行速度が
速くなる場合があります。CPUが命令を解読する事前デコード
事前実行が行われやすくなります。
稀に処理内容によっては命令数の増加よりも分岐予測や
並列実行が影響して分岐したほうが速いこともあります。
それぞれケース・バイ・ケースですね。
最新のCPUトレンドを追う一方でプログラマもそれに合わせた
プログラミングが求められています。
C言語など高級言語が一般的になった最近でも自らの最終兵器として
アセンブラ技法を習得しておくことは無駄ではありません。
プログラミング技術を磨くために挑戦してみませんか?
ゲームプログラミングの世界では最後の切り札とされる
アセンブラプログラミング!
やってみるとパズルのようでまた違った世界があります。
大量に表示したいときや大量に動かしたい場合にこういった
高速化技法が活きてきます。プログラマの努力によって可能性は
広がります。このような細かい技法をたくさん持っておくことで
いざというときに役立ちます。
今後はリアルタイムレンダリングやAIなど時折紹介できたらと
思います。
ヘキサドライブは楽しく、そして力強いゲーム開発をこれからも
続けていきます
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (5)
- 美学 (1)
- いいモノづくり道 (230)
- 採用 -お役立ち情報も- (149)
- プログラム (188)
- デザイン (99)
- ゲーム (274)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (875)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (5)
- 子育て (1)
- 筋トレ (1)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (34)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年