Valgrindを使うとメモリリークの検出などを行うことができて便利ですが、 OSやライブラリに起因するメモリリークのレポートが大量に出てくると邪魔なため、backtraceのパターンを指定して抑制(suppress)することができます。

例)valgrind.supp

   1  {
   2     <insert_a_suppression_name_here>
   3     Memcheck:Leak
   4     fun:malloc
   5     fun:_nc_table_insert_n
   6     fun:token_table_add
   7     fun:notify_register_check
   8     fun:notify_register_tz
   9     fun:tzsetwall_basic
  10     fun:localtime
  11     fun:ctime
  12  }

funはbacktrace上の関数名を示しますが、全体をマッチさせる場合、 呼び出し経路ごとに異なったパターンになるため、 沢山登録する必要が出てきてしまいます。

最新のValgrind(valgrind-3.6.0.SVNで確認)では、 "..." 記法によって中間のパターン指定を省略することが できるようになりました。 これを使用すると、先程の例は以下のように書き直せます。

   1  {
   2     <insert_a_suppression_name_here>
   3     Memcheck:Leak
   4     fun:malloc
   5     ...
   6     fun:localtime
   7  }

localtime関数を呼び出したあとに、内部のmalloc呼び出しで 発生したメモリリークを全部一括で抑制できます。便利ですね。

posted by Png genki on Mon 5 Apr 2010 at 14:42

残念ながら現時点のSVNのtrunkを使っても、SnowLeopardにValgrindをインストールしようとすると configure時にエラーが出ますが、以下のパッチをあてることでインストールできるようになるようです。

方法:

   1  % svn co svn://svn.valgrind.org/valgrind/trunk -r 11100 valgrind
   2  % cd valgrind
   3  % wget "http://bugsfiles.kde.org/attachment.cgi?id=36999" -O thepatch
   4  % cat thepatch | patch -p0
   5  % ./autogen.sh
   6  % ./configure
   7  % make
   8  # make install

これでokです。

posted by Png genki on Mon 5 Apr 2010 at 10:25

このブログシステムは長いことapache2/passengerで運用してきましたが、 頻繁にrubyプロセスが暴走してアクセスできなくなるということが発生していたので、apache2/mod_proxy_balancer/mongrel_clusterの構成に変えてみました。

しばらく様子見です。

posted by Png genki on Sat 3 Apr 2010 at 21:38

CUDA 3.0がリリースされましたが、今回からOpenCL SDKも同梱されて /Developer/GPU Computing/OpenCL にインストールされるようになりました。

CUDA ("C"ディレクトリの中身)はmakeでsampleが普通にビルドできたのですが、OpenCLの方は以下のようなエラーが出ます。

   1  src/oclUtils.cpp: In function ‘void oclPrintDevInfo(int, _cl_device_id*)’:
   2  src/oclUtils.cpp:282: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV’ was not declared in this scope
   3  src/oclUtils.cpp:283: error: ‘CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV’ was not declared in this scope
   4  src/oclUtils.cpp:290: error: ‘CL_DEVICE_REGISTERS_PER_BLOCK_NV’ was not declared in this scope
   5  src/oclUtils.cpp:294: error: ‘CL_DEVICE_WARP_SIZE_NV’ was not declared in this scope
   6  src/oclUtils.cpp:298: error: ‘CL_DEVICE_GPU_OVERLAP_NV’ was not declared in this scope
   7  src/oclUtils.cpp:302: error: ‘CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV’ was not declared in this scope
   8  src/oclUtils.cpp:306: error: ‘CL_DEVICE_INTEGRATED_MEMORY_NV’ was not declared in this scope
   9  make: *** [obj/release/oclUtils.cpp.o] Error 1

これらの定数はSDK同梱のcommon/inc/cl_ext.h の中で定義されているのですが、どうやら /System/Library/Frameworks/OpenCL.framework/Headers の方を参照してしまっているようで、こちらには定数が定義されていないようです。

posted by Png genki on Fri 2 Apr 2010 at 04:16

macportsでインストールしたパッケージのvariantsを後で変更したくなることがありますが、そのような場合には --enforce-variantsオプションが利用できます。

例)

   1  % sudo port upgrade --enforce-variants git-core +svn

posted by Png genki on Mon 29 Mar 2010 at 05:40

git submodule update を行ったときに

   1  fatal: reference is not a tree: dfae...

というようなエラーが出ることがありました。 これを解決する方法は、 submoduleのディレクトリに移動し、

   1  % git reset --hard

で親ディレクトリに戻り、コミット & push

あとは普通に git submodule update をすればok.

posted by Png genki on Sun 28 Mar 2010 at 18:48

thor のメリット

thor は rake に比べて、

  • タスク定義が Ruby メソッド
  • コマンドライン引数が簡単に扱える

というメリットがあり、お気に入りです。 前者はもしかすると 「いやいや task の方が DSL 風で...」 と人によるかもしれませんが、 後者が強力なのは異論がないでしょう。 例えば、Rails の db:create を例にすると、 環境を指定するのに rake では仕方なく RAILS_ENV を使っていますが、 もし thor であれば

   1  class Db < Thor
   2    desc "create ENV", "Create database for specified env"
   3    def create(env = 'development')
   4      ...

のように、引数の処理もデフォルト値の指定も、 ruby コードそのままで非常に直感的です。

complete usage

でも、しばらく使っていると、 上記の desc 部分(usage, descprtion)のうち、 前者の usage がメソッド定義と被っていて少しイライラしてきます。 そこで、get_args を利用して usage を補完するように改良してみました。

http://github.com/maiha/thor/tree/complete-usage

これにより、以下のように記述できます。

   1  class Db < Thor
   2    desc "Create database for specified env"
   3    def create(env = 'development')
   4      ...

   1  % thor list
   2  thor db:create ENV = "development"  # Create database for specified env

もちろん、従来の記法も利用可能です。 ユーザを増やして本家に取り込んでもらうと思うので、 よかったら使ってみてください。 バグ報告も大歓迎です。

インストール

で、こういう野良 github アプリはどうするんですかね? とりあえず適当に clone して、complete-usage ブランチの lib で、 gems/thor-0.13.4/lib とかを直接差し替えるのが一番早い、 かも?です。 あと、もちろん get_args のインストールも必要になります。

   1  % gem install get_args

posted by Png maiha on Sun 28 Mar 2010 at 16:13

Firefoxのセキュリティポリシーの変更によるものなのかと思いますが、MacOSのFirefoxでGoogle Waveを使っている時に、 外部からのペーストが出来なくなたようです。 Wave内でコピーしたテキストなどはペーストできます。

TerminalでコピーしたものをWaveに貼り付けたりすることが結構あったので、 非常に不便ですね。 一応ChromeやSafariでは、まだ外部からのペーストができるようです。

posted by Png genki on Tue 23 Mar 2010 at 01:39

CUDA kernelの引数で渡せるデータのサイズは sizeof(void*)*16 が上限で、それを超えるとエラー701(Launch exceeded resources)が発生します。

回避するためには、値渡しをしているものをメモリオブジェクト経由で渡すようにするか、そもそもメモリオブジェクトを17個以上使っている場合は、デバイスアドレスのポインタの構造体を用意し、その構造体をメモリオブジェクト経由で渡すと良いようです。

一方、OpenCLにはkernel引数のサイズに制約がないので使い易いです。 OpenCLのkernelで気を付けるべき点としては、kernel引数をfloat3* で受けると、cpuデバイスでは動くものが、gpuデバイスの場合おかしな挙動をするようになったりするので、避けた方が良さそうです。

posted by Png genki on Mon 22 Mar 2010 at 16:13

autotoolsによるパッケージのconfigure時に、ar (ARで指定できる) のオプションは、

   1  % ./configure AR_FLAGS={ar_options_go_here}

という感じに指定します。アンダースコアが入るのが紛らわしいですね。

posted by Png genki on Fri 19 Mar 2010 at 08:43