boost::timerは少し困ったちゃんです

boost::timerは時間測定なんかに結構手軽で使いやすくてイイんですが,ちょっと困った現象がいくつか発生します.
僕の手元(Ubuntu 10.04 LTS x86 + gcc4.6.0 + boost 1.40)で再現できてるのは,

  • sleepするとおかしい

    • プロセスが消費したCPU時間なので,例えばsleep(1)の実行時間を計測しても,値は0です.
  • マルチスレッド化するとおかしい

    • 各スレッドでのCPU時間の総和が出るので,何倍かになるし,ちょうど何倍という値でもない.
  • 値の最大値が結構残念

    • (処理系依存であるものの)2147秒までしか測れない場合がある.

この理由はもう言うまでもないですね,内部実装にC標準関数のclock()を用いているからです.
移植性のためなのは理解できるんですが,ちょっとこれでは困ることも.

ということで,POSIXシステムコールのgettimeofdayを使って再実装してしまえ
…というテーマで記事を書こうとしたんですが,探したらあるもんですね.

POSIXではgettimeofdayを,WindowsではQueryPerformanceCounterを使えるように書いたものがありました.

http://pasokoniziri.blog32.fc2.com/?no=15

これに基づくprogress_timerやprogress_displayを作ろうかとも思いましたがそもそもあれはboostにしては珍しい誰得ライブラリなので放置.

ついでなので,gettimeofdayの精度についてのお話.

http://www.argv.org/~chome/blog/noisefactory/2008/02/gettimeofday.html

へー,おもしれー.

標準入出力先が実際には端末かどうかを調べるには

手抜き記事です.
というかこっちはサブブログなので平常運転がこれでないといかんのですが.

さて,コマンドラインプログラムにおいて,標準入力・標準出力・標準エラー出力がそれぞれ端末かリダイレクトまたはパイプされて別のファイルまたはプロセスに渡されているかどうかを調べたいことがあります.

今日はその方法を.

Continue reading

(C++0x)可変長テンプレート引数は再帰でおいしくいただきましょう

C++0xで導入される可変長テンプレート引数,便利ですね.
僕は静的なのが大好きなので.

可変長テンプレート引数の何がおいしいかというと,例えば現在のboost::tupleはT0からT9までをデフォルトテンプレート引数と組み合わせて実装してるので要素数は10以下に限定されますが,C++0xに用意されるstd::tupleは可変長テンプレート引数で実装されるので,原理的には,無限の要素数が実現できます.
ここで本質的に重要なのは,「無限の要素数」に対応できることではなく,「任意の要素数nにおいて一般的に記述できる」ことである点に注意.

また,可変長テンプレート引数を用いて,可変長引数の関数を書けます.
これは,いわば「型安全printf」を書けることを意味します.

話がちょっと逸れましたが,じゃあその可変長テンプレート引数は実際どういう風に扱うの?という話を,関数テンプレートに関してします.
Wikipediaに書いてある範囲より僅かながら広い内容,だと思います.たぶん.

Continue reading

CUDAの分かりやすい資料

CUDAの解説で,分かりやすくてシンプルにまとまってる資料を見つけました〜.

いずれもPDF注意です.
東京大学情報基盤センター・大島聡史先生による『これからの並列計算のためのGPGPU連載講座』より,

  1. GPUとGPGPUの歴史と特徴
  2. GPGPUプログラミング環境 CUDA入門編
  3. GPGPUプログラミング環境 CUDA最適化編
  4. 特別編 CUDAプログラミング Windows編
  5. 疎行列ベクトル積を題材としたCUDA最適化プログラミング

特に2と3は非常に良いです.必読です.
あと,プログラムはちゃんと写経しましょう.ぼけーっと写すだけでもぜんぜん理解が違います.

CUDA4.0のような最新の技法・アーキテクチャ等はともかく,また量的にまだまだいろいろ書かれてないことはあるでしょうけど,基本を押さえるのによいです.

Ubuntu 10.10(x86)にCUDA 4.0を入れてサンプルを動かすまで

備忘録以上の何ものでもありませんです.

CUDA4.0はUbuntuに関して10.10を正式サポート対象としてるのもあって,ハッキリ言って,導入に躓く要素はないです.

ちなみに僕のメインマシンはモバイルノート(ThinkPad X201s)なんですが,研究室のマシンがi7-920に9500 GTなので,基本的にCUDAは(エミュレーションじゃなく)こっちでやってます.

Continue reading