OpenCLメモ

OpenCLの実装メモ。

- カーネルのコンパイルエラーを見つける方法
カーネルの記述が間違っていると、clBuildProgramが失敗する。clGetProgramBuildInfoを使うと、コンパイルエラーを取得できるが、もっと便利なのは、AMD APP KernelAnalyzerを使う方法。Source Codeのところに問題のソースを貼り付け、Compileボタンを押すと、エラーがある場合はCompiler Outputのところに、エラーが出力される。

- プロファイリングの方法
Code XLを使用する。新しいプロジェクトを作成し、プロファイルを取得したいプログラムを指定する。ProfileメニューからStart Profilingを実行。GPU プロファイルにはApplication TraceとPerformance Countersの2種類がある。

これはApplicatoin Traceの実行結果:


プログラム実行中に使用したOpenCL関数や、それに掛かった時間などがグラフ表示される。

これがPerformance Countersの実行結果:


使用したカーネルや、カーネルを実行したときのworkgroup sizeもわかる。

- 雑感

やっと一通りカーネルを実行できるようになった。実行時間だけをみると、CPUの5倍程度高速であるように思われるが、前後のメモリ転送が遅いので(とりわけCPU->GPU)、結局CPUで計算した方が3倍程度高速な状態。ちなみに、CPUのプログラムはVisual C++ Express 2012で64bitバイナリでO2最適化/AVX有効の場合 ...

more…

SQLiteで日付を扱うのって悩ましい

MySQLなどとは異なり、SQLiteにはDate型が存在しない。そのため、SQLiteで日付データを扱う場合、文字列として、あるいは数値として扱うのが一般的であると思われる。

文字列の場合、'2012-09-12'のようになるが、気をつけなくてはいけないのは、'2012-9-12'などとしてはいけないことだ。つまり、月日は、2ケタに達しない場合、0を左につけなければならない。次のような実験をしてみる:


sqlite> select strftime('%Y-%m', '2012-09-12');
2012-09
sqlite> select strftime('%Y-%m', '2012-9-12');
(何も表示されない)

strftimeによって年月を得ようとしても、0が抜けていると思うように動作しない。また、strftimeで取得しなくても、例えば日付データでorder byをする場合、2ケタ化していないと、例えば09より1のほうが大きいとみなされてしまう。つまり、9月より1月のほうが後、とみなされてしまう。そのため、2ケタ化は必須の作業となる。

もう一つ、数値として日付を扱う場合を考える。この場合も、どの時刻を基準とするか、という選択肢があるが、個人的にはユリウス日を使用するのが最も良いと思う ...

more…

Haskellって

最近Haskellで趣味のプログラムを作成することが増えた。一度型のラクさに慣れてしまうと、Lisp系言語でプログラムを作るのはおっくうになってしまう。自分も歳を取ったものだ。しかも、少なくともWebアプリに限ってだが、プログラムのメモリ使用量や実行速度でもJavaに勝っていると思う。 その割には、Webで調べてみても、あまりHaskellでガチにアプリを作りました、という記事を多く見つけられない。どちらかというと、Haskellを触ってみましたという記事が多いように感じる。もちろん、探せば多少はあって、HFTシステムをHaskellで実装しました、とか。でも他の言語と比べて全般的に記事が少ないと感じる。 もっとHaskellが使われてもいいのではないのかな、と思った次第。それだけ。

more…

blaze-htmlでのname属性

blaze-htmlでname属性の値を設定するときに、コンパイルエラーが出てしまった。次のようなエラー。

    Couldn't match expected type H.AttributeValue'<br />                with actual type[a0]'
In the return type of a call of concat'<br /> In the second argument of($)', namely
`concat ["s", show y, "-", show m, ....]'
In the expression: A.name $ concat ["s", show y, "-", show m, ....] 

concatを使って、name属性の値になってほしい文字列を作っているのだが ...

more…

位相相関による画像位置合わせ

メモ。

平行移動している2つの画像の移動量を検出する方法について調査しいていたら、位相相関法というのが見つかった。

Phase Correlation in OpenCV

高速フーリエ変換ライブラリ FFTW ver 3 の使い方

Phase correlation

位相限定相関法に基づく高精度マシンビジョン

英語ではこのような処理を一般にimage registrationと呼ぶらしい。これを行うには、上記のように周波数領域で行う以外にも、いろいろな方法が提案されている。実際に上記のページのソースを参考にプログラムを作成してみたら、ちゃんとずれ量を検出できた。

more…

Haskell雑感

以前clojureで作成した自分用WebアプリをHaskell(GHC)で作ってみている。感じた点を並べてみる。

言語としての違い

ソースの単純な見た目としてはclojureの方が自分好み。Haskellの方は"$, ->, ., <-, !"といった記号が乱発され、とにかく読む気が失せる。しかも一目見ただけでは関数の適用順さえ理解しにくい。Lispライクな文法にしなかったのはHaskellの一番いけてない点だと主張したい。

case all of
[] -> res
(x:rs) -> case Data.Map.lookup (qname x) res of
Nothing -> formatByKamoku' rs $ insert (qname x) ((V.replicate 12 0) V.// [((month x)-1, cost x)]) res
Just v -> formatByKamoku' rs $ insert (qname ...

more…

HaskellのMySQLバインディングについて調査

HaskellでMySQLを使うのにどのライブラリが良いか調べた。結果としてはmysql-simpleが良さそうだ。HDBC-mysqlも試して見たが、こちらは日本語が文字化けしてしまった。ソースを見る限りちゃんとUTF8の変換を行っているように思えたのだが。とりあえず使えるものが見つかったので今日の所はここまで。

2012/2/14 追記

Mac OS Xの方でmysql-simpleをインストールしたが、コンパイル/リンクされたファイルを実行しようとしたら、libmysqlclient.18.dylibが見つからないというエラーが発生した。このファイルがあるディレクトリをDYLD_LIBRARY_PATH環境変数で指定してみたが、なぜか解決しなかったので、"Library not loaded: libmysqlclient.18.dylib"の解消方法にあった方法を使って、/usr/libにシンボリックリンクを作成して逃げた。

どうにもMac OS XはLinuxと比べて面倒に遭遇する場合が多いと感じる。

more…

Mac OS XでGHCのコンパイルエラー

あるプログラムをMac OS X(10.6)上のGHC7.0.4(Haskell Platform 2011.04でインストールした)でコンパイルしようとしたら、

Linking main ...
Undefined symbols:
  "_locale_charset", referenced from:
      _localeEncoding in libHSbase-4.3.1.0.a(PrelIOUtils.o)
  "_iconv_close", referenced from:
      _hs_iconv_close in libHSbase-4.3.1.0.a(iconv.o)
     (maybe you meant: _hs_iconv_close)
  "_iconv", referenced from:
      _hs_iconv in ...

more…

H2クエリを少し最適化

H2データベース(バージョンは1.3.161)で、selectクエリを実行するときに、予想より時間がかかっていると思われた。それで、explainを使って、どのようにクエリが実行されているのか調べてみたら、案の定インデックスが使われないで全レコードサーチになっていた。

問題となったのは、select * from tbl where YEAR(date)=2012のように、日付型を持つフィールドにYEAR演算を施し、その結果が定数になるレコードを取得するクエリ。それで、このクエリを、select * from tbl where date>='2012-1-1' and date<='2012/12/31'と書き換えた。そうしたらちゃんとdateフィールドに設定してあるインデックスを使用するようになり、速度も改善された。

これくらいの最適化は自動的にやってくれると思っていたが、そうでもないらしい。確かに、YEARではなくて、select * from tbl where MONTH(date)=1のように、MONTH演算であれば、単純にdateフィールドでインデックスを持っていても検索は簡単ではない ...

more…

継続ベースWebアプリについて少し考えた

Webアプリにおいてセッション管理を行うときに、昔からJSPなどで行われている、セッションIDを何らかのデータに結びつける手法がある。一方、例えばSeasideのように、継続を使用してセッション管理を行うという方法もある。継続ベースというのは技術的にもおもしろいし、上のURLでも指摘しているように、二度押しなどの対策もしやすい、というメリットがある。

しかし、単純に実装してしまうと、URLがユーザにとって意味不明の文字列になってしまう。セッションと強く結びついているので、ブックマークをすることができない。もちろん、「ログインが必要な画面など、セッション内のページについてはブックマークができなくても良い」という考え方もあるが、「どうせ継続で制御できるのだから、リクエストURLはいつも固定でいい」などという安直な考えを推し進め、ログインが不要なページまで継続で実装してしまうと、意味不明なURLが大量生産されることになってしまう。

そう考えると、JSPスタイルで実装するのも悪くない。ユーザ(主語)が、ある「対象」にある「操作」を行う、というのを実装するのであれば、リクエストURLは「動作」と「対象」を表し、認証情報(「主語」)のためにセッションを用いる、というのが良い解ではないかと考えた。

more…