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年11月10日水曜日

Ganttproject

Ganttproject なるものをたまたまsourceforgeで見つけたので触ってみたらなかなか良さそう。
今度ガントチャートを書く必要に迫られたら使ってみようと思います。

2004年10月23日土曜日

Win32 GUI Generics

Win32 GUI Generics というライブラリを見つけました。
Windows の GUI プログラミングをかなりC++っぽくできそうで、かなり興味ありです。
でもまだまだ発展途上のようで、今後に期待!
WTL とどちらが使いやすいかな?

2004年10月12日火曜日

Numerical Recipes in C

9月は本買いませんでしたが、10月は Numerical Recipes in C を買いました。
数値計算の問題にあたったときに手元あれば便利ですね。
内容はぱらぱらとしか読んでいませんが、面白そうな項目から目を通していこうかなと。

ちなみに、洋書では新しい版が出ているらしいですが、日本のも改訂されないのかなー。
英語のは、下のURLからオンラインで読むこともできます。
http://www.nr.com/

2004年9月16日木曜日

MFCメモ

モードレスダイアログをつくるとき、newでインスタンスをつくったら
PostNcDestroyをオーバーライドしてその中でdelete thisする。
そうすると、ダイアログが閉じられたときに自動的にdeleteされる。

2004年9月1日水曜日

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

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


2004年8月7日土曜日

Hacker's Delight

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

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

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

2004年7月16日金曜日

メンバ関数テンプレートの部分特殊化 vs オーバーロード

メンバ関数テンプレートの挙動を、とある引数に対してのみ変更したい場合の選択肢としてテンプレートの特殊化オーバーロードがあります。

struct ClassA {
  // メンバ関数テンプレート
  template<typename T> void Func(T value) {
    ...
  }

  // テンプレートの特殊化
  template<> void Func<int>(int value) {
    ...
  }

  // オーバーロード
  void Func(float value) {
    ...
  }
};

優柔不断な自分はここで、テンプレートの特殊化にするかオーバーロードにするか悩みました。
で、それぞれのメリット・デメリットを考えてみました。

テンプレートの特殊化
メリット
・ClassAを定義しているヘッダファイルを変更することなく、新しい特殊化を追加できる。
例えば、

ファイル ClassA.h
struct ClassA {
  // テンプレートメンバ関数
  template<typename T> void Func(T value) {
    ...
  }
};


ファイル ClassAUserImpl.cpp
#include "ClassA.h"

// テンプレートの特殊化
template<> void ClassA::Func<int>(int value) {
  ...
}


ということが可能で、特殊化に関しては「クラスの使用者側で必要になり次第勝手に(自己責任で!)特殊化してください」ということができます。
これはメリットであると共にデメリットにもなりうるかもしれません。

デメリット
・古いコンパイラだとテンプレートの部分特殊化を使用できない。

オーバーロード
メリット
・テンプレートではないのでメンバ関数の実装をインラインに書く必要がない。
・C++の基本なので読みやすい(?)

デメリット
・特になし


ちなみに、テンプレートの特殊化とオーバーロードを同じ型に対して同時に行うとどうなるのかと思って試してみたところ、オーバーロードが優先されました。(VC7.1)

2004年7月13日火曜日

VisualCでのデバッグTips

VisualCは何年か使ってますが、全然しりませんでした。
あまりの衝撃にこっちにもメモw

クイックウォッチでエラーコードとその内容を表示する

内容がないのもなんなので、追記。
例外が発生した箇所でBreakしたい場合は、「デバッグ」メニューの「例外」で設定することができます。(Visual C++ .NET 2003)
指定した例外以外にも色々な特殊な状況でBreakしたりしなかったりが設定できます。

2004年7月9日金曜日

GPUによるビデオ処理の簡単な見積もり

1080iのビデオ(解像度は1920 x 1080)のトランジション処理をGPUにさせるとします。

ビデオデータの転送量は
1920 x 1080 x 4Byte(32bpp) x 30fps = 248,832,000 Byte/sec
です。
トランジションは入力が2つ、出力が1つ発生するので、入力に474MB/s、出力に237MB/s、計711MB/sのデータ転送が発生します。
















各種バスの転送速度
PCI 33MHz133MB/s
PCI 66MHz533MB/s
AGP 1x266MB/s
AGP 2x533MB/s
AGP 4x1.06GB/s
AGP 8x2.13GB/s
PCI Express 1x500MB/s
PCI Express 2x1GB/s
PCI Express 4x2GB/s
PCI Express 8x4GB/s
PCI Express 12x6GB/s
PCI Express 16x8GB/s
PCI Express 32x16GB/s


単純計算では赤字のバスで転送が間に合いません。
当然ながら様々な要素が絡んでさらに条件は厳しくなると思います。

2004年6月25日金曜日

HLSL本

プログラミングMicrosoft DirectX9 グラフィックスパイプライン
という本をプレゼントされました。DirectX9シェーダの本です。
シェーダには興味がありつつもまだ手をつけていなかったので、
これを機にぼちぼちやっていこうかなーという感じです。

2004年6月18日金曜日

クリティカルセクションのコスト

クリティカルセクションの実行コストは軽いと聞きますが
実際にどれくらいのコストがかかるのか計測してみました。

::EnterCriticalSection(&crit);


上記のコード2行を実行するのにかかったコストは自分の環境で約400クロックでした。
Pentium4 2.8GHzのCPUですので、時間にするとだいたい140ナノ秒かな?

数値はあまりあてになりませんが、だいぶ軽いですね。

2004年6月4日金曜日

Exceptional C++

最近、毎月1冊と決めて専門書を買っています。
今月は以前から欲しかった Exceptional C++ を購入しました。

まだ3分の1くらいしか読んでいませんが、例外安全について結構勉強になりました。
ほんとにC++ってDeepですよねぇ。潜っても潜っても底が見えないというか。。

2004年5月26日水曜日

volatile

C++でvolatile修飾子を変数につけるとその変数はスレッドセーフになるという勘違いを今までしていました…

マルチスレッドでの参照カウント

オブジェクトの寿命を管理する手段として参照カウントがあります。
オブジェクトが必要になれば参照カウントをインクリメントし、
不要になればデクリメントします。
どこからも全く必要とされていない場合は参照カウントが0になるのでオブジェクトを破棄することが出来ます。

参照カウントをマルチスレッドで操作する場合は、参照カウントが複数のスレッドから同時に変更されるのを防ぐ必要がありますが、
WindowsのAPIにはそのためのAPIがあります。今日知りました…

InterlockedIncrement
InterlockedDecrement

です。それぞれ、参照カウントを増やしたり減らしたりします。

2004年5月25日火曜日

目薬

疲れ目に効く!なんていう目薬がたくさん市販されていますが、
はっきりいって、これまでそんなの信じていませんでした。
目が潤うだけなんじゃないかと。
目薬はコンタクトをつけていて、目が乾いてきたときだけ使っていました。

そんな自分ですが、先日ふらっと薬局に行ったついでに
マイティア ビタミンB2 B6 E
という、そこそこ(?)の価格帯の目薬を買ってみました。

で、目が疲れたときに使ってみました。
効きます!
気休めなのかもしれませんが、本当に目がすっきりしました。
ビタミンとか入っていて目にも良さそうな気がするので、これからはこまめに使おうかなと思います。

2004年5月14日金曜日

typedef template?

templateのパラメータを2つ持っているクラスがあるとして、
そのうち1つだけを決めてもう片方をtemplateパラメータとして残しておきたい
ということがありました。

template<class A, class B> class Foo .....

template<typename T> typedef Foo<int, T> IntegerFoo; // IntegerFoo<string> のように使用する(したい)


ところがこれできないんですね。。。あちこちでC++の規格に追加してよと提案されてはいるようですが。

というわけで、今回はtypedefするのではなくて、派生クラスを定義して同じことを実現しました。

template<typename T> class IntegerFoo : public Foo<int, T> {};


ただこの手法はもちろんFooが派生可能であるということが前提です。

調べてみると他にもいろいろなアプローチがあるようです。
MSDN Deep C++ Typedef Templates

2004年5月13日木曜日

WTL

Microsoftが公開していたGUIライブラリ、Windows Template Library(WTL)
がSourceForgeにて公開されたようです。
これからもどんどんと改善されることを期待していいのかな?
近々機会があれば使ってみたいと思っています。

2004年5月11日火曜日

Boost C++ Library プログラミング

Boost C++ Library プログラミング という本を買いました。

Boostを今まで愛用していたとはいえ、知らないライブラリもまだまだたくさんあるので、
これから活用していきたいと思っています。

The Boost Lambda Library

Boostというライブラリが好きです。
これは色々なライブラリを併せたもので、
スマートポインタなんかはとても便利で一度使うともう離れられません。

そんなBoostのライブラリの中に、lambda というライブラリがあります。
無名関数を作るというライブラリなのですが、はっきり言って今まで使い道が分かっていませんでした。
まぁ僕には縁のない学術的な世界の話なのだろうと。。。

で、最近STLのアルゴリズム(find_ifとか、bindとか)を使い始めました。
ループを書かなくてすんだりして楽なのですが、find_ifなんかは比較関数をわざわざ用意しなくてはならず、逆に面倒なことになったりもしていました。
こんな関数を用意せずに使えたらなぁ・・・ってそれがBoostのlambdaなのでした。

すごい!の一言。
もう少し勉強して今度実際に使ってみよう。

2004年5月8日土曜日

Color Space FAQ

色空間のことで質問したらcolorspace-faqというのを教えていただきました:-)

2004年4月30日金曜日

グリッドコンピューティング

最近、なんとなくグリッドコンピューティングに興味が出てきて、
簡単なグリッドフレームワークを作ろうかと思っています

頭の中でおおまかな設計はできてきていますが、
果たして、専門的な知識のない素人にも作れるでしょうか!?

2004年4月16日金曜日

プロファイラ

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

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

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

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

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

2004年4月14日水曜日

パケット爆発

新居にはまだネット環境がないのですが、メールのチェックだけでもと、
PCと携帯電話を繋いでネットに接続しています。

で、先日今月(4/1~)の通信料をみてみたところ、

通信料(4/13迄) 31,292円
(パケット数 205,817パケット)


となっていました。

携帯電話のパケット料をなめてました・・・

2004年4月3日土曜日

新社会人

昨日から新社会人になりました!
2日間研修があって、明日は入社式です。新しい事を色々覚えたり、緊張することがあったりとなかなか最初なので大変ですが頑張っていきたいと思います。

#ちなみに引っ越したばかりでネット環境がまだないので、PCに携帯電話を繋いでau.NETを使ってネットしてます。。

2004年3月25日木曜日

サーバ機

最近、常時稼動させるサーバ用のマシンが欲しいなと考えているのですが、調度いいのを見つけました。
Be Silent M6100
ファンレスで省電力なのが魅力です。CPUがVIA Eden 600MHzとかいうやつですが、個人で使うサーバなのでそんなにパワーも必要ないのでこれで十分です。
欲しいなー

2004年3月22日月曜日

卒業式!

大学の卒業式に行ってきました!この4年間を振り返ると本当に短かったけれど、色々なことがあったなーと感慨にひたってしまいました。ただ、卒業研究の担当教授が都合で欠席されて会えなかったことが非常に残念でした。

これからは社会人として頑張っていきたいと思います!

2004年3月20日土曜日

電車で読書

家から大学まで片道2時間半の道のりをボーっと過ごすのはとてももったいないので本を読んだりします。といっても一般的な文庫本とかではなく技術書である場合が大半ですが、本を開いて読み始めると10分もすれば眠気が襲ってきて、寝てしまいます(笑)
たぶん実質読書している時間は30分くらいなのではないかと思います。

ちなみに今は Effective STL を読んでいます。STLは今までコンテナくらいしか使っていませんでしたがこれからはアルゴリズムやファンクタもしっかり活用していこうと触発されました。

2004年3月19日金曜日

blog はじめました

学生生活もそろそろ終わり、社会人になろうかという今日この頃。論文も書き終わってすこし心に余裕ができたのでblogでもはじめてみることにしました。どれくらいまともに続くか少し不安ではありますが、色々と書き留めていきたいと思います。

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP