nDiki : PDL::PP

PDL::PP

PDLルーチンを生成するためのプリプロセッサ。

関連情報

2004年2月19日 (木)

[ Perl ] PDL::PP で C extension を書く

PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。

.pd ファイルを書く

とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。

Makefile.PLを修正する

Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。

がどうもうまくいかない。 PDL::PPMakefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 PerlXS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。

Makefile.PLを作る

Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。

 Foo-Bar-x.xx
   |
   +- Makefile.PL
   |
   +- lib
   |    |
   |    +- Foo
   |         |
   |         +- Bar.pm
   |         |
   |         +- Bar
   |              |
   |              +- Math.pm
   |              |
   |              +- MathNoEx.pm
   |              |
   |              ...
   |
   |
   +- blib/...
   |
   +- MathEx
   |    |
   |    +- Makefile.PL
   |    |
   |    +- MathEx.pd
   ...

パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。

全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。

XSが使えない環境との両対応

XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。

 use vars qw($IMPLEMENT_CLASS $AUTOLOAD);
 BEGIN {
   $IMPLEMENT_CLASS = 'Foo::Bar::MathEx';

   eval "use $IMPLEMENT_CLASS";
   if ($@) {
     warn "Can't load $IMPLEMENT_CLASS: $@";
     $IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx';
     eval "use $IMPLEMENT_CLASS";
     die $@ if $@;
   }
 }

 sub AUTOLOAD {
   my $name = $AUTOLOAD;
   $name =~ s/.*://;
   my $implement = $IMPLEMENT_CLASS . '::' .$name;
   no strict "refs";
   *{$name} = \&{$implement}; # ここでシンボルテーブル設定
   return &{$implement}(@_);
 }

最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。

ActivePerl 5.6 + Visual C++ 6

使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。

 PPM化までここで済ませば、他のPCにも持っていけるはず。

さて

これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。

スポンサード リンク
[ 2月19日全て ]

2004年6月14日 (月)

PDL疎行列

計算しようとしている行列が 2000 x 2000 次元を超えているので、PDLで素直に計算させるとしんどい。 PDLはネイティブに疎行列をサポートしていないので、独自に実装する必要があるので面倒だな(一応 CPANPDL::Sparse というのもあるにはある)。

外部で計算させようかとも思ったが、GNU Octave もネイティブサポートなし。

やはりPDL::PPを使って自前でPDL上に実装するしかないか?

[ 6月14日全て ]

2005年5月18日 (水)

Inline::Pdlpp で 手軽に PDL::PP のコードを書く

PDL を使用しているプログラムの高速化のため、再び PDL::PP でコードを書こうとマニュアルを見直したりしている。

PDL::PP にも Inline 系の Inline::Pdlpp モジュールが用意されているのか。 PDL::PP仕様は結構わかりにくくて(かなり)慣れないと大変。 何度も書いてはテストしてみることになるので、そういった意味でも Inline できるのはすごい便利。

Inline::pdlpp で関数ができあがったら 整理して PDL::Core::Dev のサポートのもとで Makefile.PL を書くようにすれば、いっちょあがり。

[ 5月18日全て ]

2009年9月3日 (木)

今日のさえずり: 「ポロシャツなら一緒ですよ」と若い女の子に一蹴された

2009年09月03日

  • 08:47 今日は新しい PS3 の発売日か。ヨドバシカメラに待っている人がちょっぴりいる。 #Akihabara L:秋葉原 [mb]
  • 08:49 そして昭和通りにはラブプラスのカードを首からさげている人。 #Akihabara L:秋葉原 [mb]
  • 10:41 アカデミック系のプロジェクトに久しぶりに触れると癒される。 *P3
  • 12:12 いちおう会社には襟のついたシャツを着てくるようにしているのだが「ポロシャツなら一緒ですよ」と若い女の子に一蹴された。 *P3
  • 12:14 あ、ちなみに着てきているのはポロシャツじゃなくてラガーシャツなんだけど。 *P3
  • 12:21 あ、下はジーパンなんですよ。 RT @cakesjun: @Naney ポロシャツは襟がやわらかいからピシッと見えないのかも。でも夏にワイシャツは暑いですよねぇ・・ *P3
  • 12:21 いつも襟が曲がっているしって言われた。 *P3
  • 12:38 「ジーパンの(膝の)穴小さくなったんですか!」いえジーパン1本しか持ってないわけじゃないですから。 *P3
  • 12:41 2009年8月31日の歩行: 4559歩、3.61km、35分、6.18km/h、消費 170.9kcal、脂肪燃焼 24.4g、2.5エクササイズ。 *P3
  • 12:42 2009年9月1日の歩行: 7466歩、6.00km、54分、6.57km/h、消費 268.5kcal、脂肪燃焼 38.4g、3.9エクササイズ。 *P3
  • 12:43 2009年9月2日の歩行: 10074歩、8.06km、74分、6.46km/h、消費 370.5kcal、脂肪燃焼 52.9g、5.4エクササイズ。 *P3
  • 13:39 @zakwa ファッションチェックをするあたり zakwa 2号と呼べそうです。 *P3
  • 15:21 @naofumiyoshida お疲れさまでした。 *P3
  • 15:35 ああ、PDL::PP 使っているんだっけ。ああ Visual Studio 6.0 も入れないと駄目かあ。 *P3
  • 15:39 Visual Studio 2005 が入っている環境に Visual Studio 6.0 か。共存できるらしいがちょっと不安。 *P3
  • 19:21 ペコちゃんのバッグ持っている人がいる。あれ、ちょっといいな。 [mb]
  • 19:23 SO905iCS のカーソル自動移動を最速にした。 [mb]
[ 9月3日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.058867s / load averages: 0.27, 0.54, 0.73
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker