ラベル 最適化 の投稿を表示しています。 すべての投稿を表示
ラベル 最適化 の投稿を表示しています。 すべての投稿を表示

2009年4月8日水曜日

jitasm

最近jitasmなるオープンソースのプロジェクトをやっています。インラインアセンブラ風の構文で動的にコード生成を行うためのC++ライブラリです。
この手のライブラリとしてはxbyakが有名ですが、jitasmは後発なりに特色を出していけたらと思っています。

目標

  • MASM, VCのインラインアセンブラ風
  • 美しく書ける
  • 簡単に使える
  • 軽い
  • x86/x64のソースコードポータビリティ
特徴 (version 0.2.0)
  • x86/x64汎用命令
  • x87 FPU命令
  • MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2
  • naked, cdecl, Microsoft x64 fastcall の関数呼び出し規約サポート
  • 関数呼び出し規約に沿ったprolog/epilogの自動生成
  • 制御構文(If, Repeat, While)
  • VC8, VC9対応

2007年9月20日木曜日

シフト命令で割り算の落とし穴

整数を2のべき乗で割り算したいとき、割り算の代わりに右算術シフトを使うことがあります。
特に割り算の処理コストが無視できないときにはよく右算術シフトを利用します。

が、今日1つ落とし穴があることに気付きました。

(-1) >> 1


が0になってくれません。

当然といえば当然ですね。0xFFFFFFFF はどれだけ右算術シフトしても 0xFFFFFFFF です。。。

見事にはまってしまいました。

2006年6月6日火曜日

ビット演算で整数割り算

ビット演算と引き算を使った整数の割り算のコード。
ただし、31bit符号なし整数 ÷ 15bit符号なし整数 という制限つき。

// 31bit unsigned int / 15bit unsigned short
unsigned short divsu(unsigned int x, unsigned short y)
{
 for (int i = 0; i < 16; i++)
 {
  x <<= 1;
  if (x >= (unsigned int)y << 16)
  {
   x -= (unsigned int)y << 16;
   x |= 1;
  }
 }

 return x;
}


参考:ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

2004年12月2日木曜日

インラインアセンブラでのCマクロ

インラインアセンブラでCのマクロを使いたくなることがあります。
例えば以下のようなマクロ。WORDの掛け算をします。

#define MULLWD(mmDst, mmVal, mmTmp) \
movq mmTmp, mmDst \
pmullw mmDst, mmVal \
pmulhw mmTmp, mmVal \
punpcklwd mmDst, mmTmp

で、このマクロをインラインアセンブラ中で使用します。
__asm {
......
MULLWD(mm0, mm2, mm3)
MULLWD(mm1, mm2, mm3)
......
}

しかしこれはコンパイルできません。
MULLWDマクロは以下のように解釈され、改行が抜けてしまっているからです。

#define MULLWD(mmDst, mmVal, mmTmp) movq mmTmp, mmDst pmullw mmDst, mmVal pmulhw mmTmp, mmVal punpcklwd mmDst, mmTmp

VCでは以下のように各命令の前に __asm と書くことでコンパイルできるようになります。

#define MULLWD(mmDst, mmVal, mmTmp) \
__asm movq mmTmp, mmDst \
__asm pmullw mmDst, mmVal \
__asm pmulhw mmTmp, mmVal \
__asm punpcklwd mmDst, mmTmp

2004年9月1日水曜日

VisualCの最適化 - 拡張命令セットの有効化

VisualC++2003ではコンパイルオプションに「拡張命令セットの有効化」というのがあります。
これをSSEにすると、なんとCで書いた普通のfloat計算のコードがSSEのスカラー演算命令を使ったコードとしてコンパイルされて出力されます!
今まではsqrtなどの組み込み関数がSSEで最適化されたされたやつに切り替わるくらいかなと思っていたのですが予想以上の効果があるようです。
同様にオプション設定でSSE2を選択するとdouble計算のコードも最適化されるものと思われます。(こっちは未確認)


2004年8月7日土曜日

Hacker's Delight

今月はHacker's Delightを買いました。
かなり以前から欲しいと思っていた本なのですが、後回しになっていました。

内容はまだほとんど読んでいないですが、
ビット演算だけでびっくりするようなことをしています。

計算速度が要求されるようなプログラムを書く人にとってはすごく参考になる本です。

2004年4月16日金曜日

プロファイラ

VC7(VisualStudio .NET 2003)で開発しているプログラムを最適化しようと思い、プロファイラを使おうと思ったら、メニューのどこを探してもプロファイルの文字がない!
そこでヘルプを探してみたら、

リンカ ユーティリティであるソース プロファイラは削除されました。

なんてこと!仕方ないのでVC6でコンパイルしてやってみようとも思いましたが、コンパイルエラー多発でやる気喪失w

なんかフリーのプロファイラないかなーとおもったらありました。
DevPartner Profiler Community Edition
DevPartner Studioという製品の評価版?のようなものでしょうか。簡単に使ってみましたが特に制限などはなさそうです。

使い方としては、「ツール」->「DevPartner」メニューの中の「Profiler」という項目と「Native C/C++ Instrumentation」という項目にチェックをいれたあと、プロファイリングしたいプロジェクトをリビルド。すると、プロファイラがコンパイラに介入して必要なコードを勝手に埋め込んでくれます。
その後、「デバッグ」->「開始」で実行し、プログラムを動かせばプロファイリングしてくれます。
プロファイリング結果はなかなか見やすいもので、よくできていると思いました。

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP