昔の最近の出来事(2012.08)

2012/08/31

日付け越え前に帰着。

Webで調べ事をしていたらあまりの眠さに急速停止。

2012/08/30

日付け越え。

もそもそとコーディング。なんだか挙動が変なのを調べていたら、 std.format()が変な値を返していたり。具体的には "%f" の変換結果が 常に0になってしまうというもの。ひとつ前のgdcだと問題無く動作したり。 でも、libphobosには関係しそうな差分が無かったり。うーむ。

2012/08/29

遅めに帰着。

そういやwintabの64bit対応ってやり方があるようで無いような。 LoadLibrary()で動的にローディングできるものの、引数がポインタ渡し の関数では、うまく動かないように思います。てか実際にやってみたら動きが怪しい。 DLLだけを利用するのは手軽なのですが、リコンパイルが必要な場合にやっぱり困るなぁ と思ったりも。

2012/08/28

遅めに帰着。

もそもそとコーディング。手持ちコードを32bit/64bitのマルチビルド対応。

2012/08/27

遅めに帰着。

OpenAL 64bit のSegfaultの件原因判明。Ogg/Vorbisのバインディングは 真面目に行っておらず、OggVorbis_File構造体とvorbis_info構造体だけを サイズだけを合わせる形で宣言してました。つまり、

struct OggVorbis_File{
  int padding[200] ;
} ;

みたいな感じ。初歩的な話なのですが、構造体メンバーにはポインタ型も 含まれる訳で、32bitと64bitではポインタ変数のサイズが変わります。 しかし、前述のような宣言ではサイズは普遍となる為、64bit時には隣の 変数にはみ出してしまい、内容が壊れているという流れでした。うーむ、しまった。

で、そこをひとまず直したら、ちゃんと音が出ました。つまり、OpenALとalutの ソースからの64bitビルドは一応成功したという感じ。

2012/08/26

AM中に起床。

人類で初めて月面に降りた人であるニール・アームストロング氏が亡くなったらしい。 昨日、たまたま観たDVDに関係あった人なのは単なる偶然。

OpenAL 64bit。先日のshared libraryがロードできない件。dllビルド時は cygopenal-1.dllという名前のファイルで生成していたのを、OpenAL64.dllという ファイル名に変えてリンクしたのですが、ロード時はcygopenal-1.dllをリンク しようとしているらしく、それでDLLが見つからないというエラーになっていたようです。 ファイル名を変えずにリンクすれば、ひとまず実行時エラーはしなくなり、 ウインド表示できました。が、再生しようとしたところでSegfault。
gdbで見てみたところ、以下のような感じ。

(gdb) where
#0  0x00000000774aca99 in KERNEL32!IsBadWritePtr () from C:\windows\system32\kernel32.dll
#1  0x00000000004bfb88 in fread ()
#2  0x00000000004bfb88 in fread ()
#3  0x00000000004bfb88 in fread ()
#4  0x0000000066bc9870 in alGenBuffers (n=1, buffers=0x4bfb88) at ../OpenAL32/alBuffer.c:199
#5  0x0000000000403d4f in oggPlayer.oggPlayer.polling() (this=...) at oggPlayer.d:124
#6  0x0000000000402294 in myMainWindow.myMainWindow.proc() (this=..., hwnd=0x1b40c80, msg=275, wp=1, lp=0) at myMainWindow.d:119
#7  0x0000000000408172 in MainWindow.MainWindow.preproc() ()
#8  0x00000000022e0c00 in ?? ()
#9  0x0000000001b40c80 in ?? ()
#10 0x0000000000000113 in ?? ()
#11 0x0000000000000001 in ?? ()
#12 0x0000000000000000 in ?? ()

alGenBuffers()引数にバッファのポインタを渡していて、それが書き込みアクセス可能か 否かをIsBadWritePtr()で検査しているようですが、そこでずっこけている予感。 ところが、alGenBuffers()の関数呼び出し元では値が少し違っているようにも見えてい たり。ただ、gdbの表示もなんだか妙な感じになっている為、何を信じてよいのか いまいち良くわからない感じだったりも。

どうやら、D言語領域で割り当てたメモリ領域が書き込み不可な感じになっているっぽい。 動的配列割り当てを行っているだけだったのですが、試しにその領域に値を代入すると そこでSegfaultになるという感じ。なぜそうなるかはひとまず置いておくとして、 そういう書き込み不可なポインタを渡されたとしてもIsBadWritePtr()はうまく値を 返してくるのかと思っていたのですが、Segfaultするってのは正しい動きなのか?

コンパイラをひとつ前のバージョンに戻してみたけど状況変わらず。

2012/08/25

AM中に起床。

最新刊であるONEPIECE(67)って、初版400万部越えだとか。すげぇ。

gdcのMinGW版を最新ビルドを行ったり。内容的にはマイナーな修正ばかりの様ですが、 時々ビルドしとかないとやり方を忘れる&ダメになった時にどの辺の変更が怪しいか 勘が働かなくなるので。ひとまずビルドは問題無し。

そういやOpenALを使用した手持ちコードは、x86_64対応できていません。というか、 コードは対応できるのですが、x86_64のOpenALのDLLが無いようだったので。 まぁそのうちと思っていたのですが、Webを探すも何故か見つけられず。うーむ。 ソースコードからビルドできるか?と思ったのですが、ソースコードのアーカイブは 置かれておらず、svnでアクセスするもエラーが出てcheckoutできず。ちなみに、

$ svn co svn://connect.creativelabs.com/OpenAL
svn: E720005: Can't open 'C:\WINDOWS\TEMP\report.tmp': Access is denied.

てな感じのエラーになるので、一瞬クライアント側のエラーのように見えるのですが、 Cygwinのsvnでこんなドライブ指定でアクセスするか?と思い、VMwareのFedoraで 試しても同じエラーになる為、向こう側のリポジトリに問題があるようです。

どうやらopenal-soft-* ってのにソースが一式入っている事が判ってみたり。 MinGWでcmakeをうまく使えなくてすったもんだしながら強引にdllを生成して、 リンクできる感じになったのですが、実行時にエラーする実行ファイルが出来上がったり。 lddが使えないのでお手上げ。

$ ./oggplayer.exe
/home/TANE/..../oggplayer.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory

何気に「Space Race 宇宙へ 〜冷戦と二人の天才〜」のDVDを観ながら作業してたり。 1945年 時点では兵器目的でしかなかったロケットが25年後には月に人を運んでいた という進歩の早さは何度聞いても驚くなぁ。

2012/08/24

早めに帰着。

あまりの眠さにポニョを観ることなく急速停止。

2012/08/23

遅めに帰着。

ちょろり調べ事をして終了。

2012/08/22

遅めに帰着。

MinGW向けのgdcにはビルドスクリプトが用意されているのですが、それを使ったビルド ができるのか試してみたり。でも、なんだかちゃんと動作するようにメンテされていない気が。

2012/08/21

日付越え前に帰着。

ちょいと作図をしたくなったのですが、そういやCinderellaが入ってないなぁと 思い、久しぶりに公式ページを 覗いてみたところ、Version2がフリーで公開されてました。ライセンスを買う事で フルスペックを使用可能になるようです。早速インストールしてみたり。 物理シミュレーションなどの新しい要素は全く使えてませんが、線分の追加が可能 になっていたりと、ドロー機能としても充実した感じがします。

2012/08/20

早めに帰着。

Webのブックマークなんかに表示されているGoogleのアイコンデザインが変わっていたり。

あまりの眠さに急速停止。

2012/08/19

昼前起床。

CUDAについて調べごと。おおよそ次のような理解。


OpenCLの様にプログラムのローダーを別途用意する必要が無いなど、 見た目の記述が判り易く書けるようになっているようですが、専用のコンパイラが 必要という点が個人的にはイマイチに感じたりも。もしかするとGPUコードでも デバッグが良い感じにできるのかも知れませんがそこはよくわからず。

先日のgdcのパッチがうまく当たらない件は修正されてました。てかgccパッチやconfigure系 のスクリプトをコミットする前には、毎回クリーンビルドできる事を確認してからコミット して欲しいなぁと思ったりも。

遅ればせながらSAIの新しいの(1.2.0-Beta3)を試してみたり。何気にメモリ上限が4GBに認識 されている点がうれしかったり。

そういえば以前、Inkscapeには いつの間にかコンボボックスやスピンのテキストボックス部分の文字が表示されなくなる というバグが存在しているのですが、GIMP2.8でも同様のバグがあるっぽい。 GIMP2.8の方では直したものが本家とは別にバイナリ配布されているようですが、ソースが 公開されていないためどう直したのかが判りません。修正版をバイナリ配布するよりも、 ソースの差分を公開して欲しいなぁと思わなくもなかったり。

2012/08/18

AM中に起床。

OpenCLのDeviceQueryではdouble型が使えそうな感じなので、使い方があるんじゃ ないかと調べたり。どうやら、ターゲットコードに 「#pragma OPENCL EXTENSION cl_khr_fp64 : enable」と入れる事で使える 事が判明。少し重くなった気がしますが、1e+14倍くらいまで拡大できる感じ になってみたり。まぁそれでもあまり深くはありませんが。

そんな訳で実行バイナリだけですが置いてみます (mandelviewGPU_v000.7z)。


mandelviewGPU_v000スクリーン

遊べればラッキーくらいの感じでひとつ。

録画してあったゲーマーズTV夜遊び三姉妹 裏面を観たり。 アメリカで開催されている格闘ゲームの大会 Evolution の特集的なもの。 大会自体は日本勢の首位連覇ならずという結果でした。そういやEvolutionは 賞金が出る大会です。裏レポート的なのはファミ通WAVEとかの方が面白かった のですがそれはそれとして。

gdcのアップデートが来た模様。DMD2.060対応されてます。MinGWにも来てほしい のですが.....
そんな訳でVMware上のFedora17(64bit)でビルドを試してみたり。 ベースとなるgccはスナップショットであるgcc-4.8-20120812。前回もそうだったのですが、 setupスクリプトでパッチがうまくあたらなかったり。そこだけ手で対応したら、 後は特にエラーする事無く x86/x86_64のマルチビルドできたり。

2012/08/17

早めに帰着。

コマンドラインで実験していたOpenCLのマンデルブロ描画プログラムを ウインド表示できるようにしてみたり。640×480だと 最長1秒以内で 描画できるので、ズームやシフトはリアルタイムに行ってもストレスが 無いレベルだったり。なもんですから解像度限界に達するのもあっという間。

そういやMPFの仮数部のbit数を減らしたら、何故か計算結果が妙な感じに なるのに悩まされたり。原因不明。

なんとなくgdcのバグかもという感じ。一時置きのインスタンスが壊れている 感じになってて、スコープをずらせば大丈夫になったり。納得はしてない。

あまりの眠さに急速停止。

2012/08/16

早めに帰着。

SAIの開発が再開されたようです。64bit対応、マルチコア対応、じゅるり。 楽しみにしています(^^)

2012/08/15

早くもなく遅くもなく。

あまりの眠さに急速停止。

2012/08/14

遅めに帰着。

OpenCLを使った数学ライブラリとか存在するのかしら?と思い、少し探ってみた のですが、これといった感じのは見つからず。GPGPUはなんとなく話題になっては いるものの、それを使う場面となると急に何も出てこなくなるという気がしたりも。

2012/08/13

気持ち早めに帰着。

OpenCLを使ったマンデルブロ集合描画。色づけなどをMandelbrotViewに合わせてみて 比べてみたり。8CPU並列と比べるて、おおよそ40〜50倍くらい高速に描画できるようです。 ただ、float型で計算しているものですから、たかだか 2e+5 倍くらいの拡大で浮動小数点数の 解像度不足に陥ってしまいました(^^; うーむつまらん。

2012/08/12

昼前起床。

D言語からOpenCLを使ってGPUで計算させる実験をもそもそと行ってました。 要素数が255*1024*1024/4個の二つの配列 a[],b[] を使って、あまり意味はありませんが 「d[] = (a[] * b[] + a[] - b[])/3.0」てな式の配列演算を行ってみました。

$ ./vector.exe
GPU laptime : 81 ms
Result: 3.666667 6.333333 ... 1489494792470528.000000
CPU laptime : 180 ms
Result: 3.666667 6.333333 ... 1489494792470528.000000

デバイス情報的には以下のような感じ。

 ---------------------------------
 Device GeForce GTX 550 Ti
 ---------------------------------
  CL_DEVICE_NAME:                       GeForce GTX 550 Ti
  CL_DEVICE_VENDOR:                     NVIDIA Corporation
  CL_DRIVER_VERSION:                    301.32
  CL_DEVICE_VERSION:                    OpenCL 1.1 CUDA
  CL_DEVICE_OPENCL_C_VERSION:           OpenCL C 1.1 
  CL_DEVICE_TYPE:                       CL_DEVICE_TYPE_GPU
  CL_DEVICE_MAX_COMPUTE_UNITS:          4
  CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:   3
  CL_DEVICE_MAX_WORK_ITEM_SIZES:        1024 / 1024 / 64 
  CL_DEVICE_MAX_WORK_GROUP_SIZE:        1024
  CL_DEVICE_MAX_CLOCK_FREQUENCY:        1800 MHz
  CL_DEVICE_ADDRESS_BITS:               32
  CL_DEVICE_MAX_MEM_ALLOC_SIZE:         255 MByte
  CL_DEVICE_GLOBAL_MEM_SIZE:            1023 MByte
  CL_DEVICE_ERROR_CORRECTION_SUPPORT:   no
  CL_DEVICE_LOCAL_MEM_TYPE:             local
  CL_DEVICE_LOCAL_MEM_SIZE:             48 KByte
  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:   64 KByte
  CL_DEVICE_QUEUE_PROPERTIES:           CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
  CL_DEVICE_QUEUE_PROPERTIES:           CL_QUEUE_PROFILING_ENABLE
  CL_DEVICE_IMAGE_SUPPORT:              1
  CL_DEVICE_MAX_READ_IMAGE_ARGS:        128
  CL_DEVICE_MAX_WRITE_IMAGE_ARGS:       8
  CL_DEVICE_SINGLE_FP_CONFIG:           denorms INF-quietNaNs round-to-nearest round-to-zero round-to-inf fma 

  CL_DEVICE_COMPUTE_CAPABILITY_NV:      2.1
  NUMBER OF MULTIPROCESSORS:            4
  NUMBER OF CUDA CORES:                 192
  CL_DEVICE_REGISTERS_PER_BLOCK_NV:     32768
  CL_DEVICE_WARP_SIZE_NV:               32
  CL_DEVICE_GPU_OVERLAP_NV:             CL_TRUE
  CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV:     CL_TRUE
  CL_DEVICE_INTEGRATED_MEMORY_NV:       CL_FALSE
  CL_DEVICE_PREFERRED_VECTOR_WIDTH_<t>  CHAR 1, SHORT 1, INT 1, LONG 1, FLOAT 1, DOUBLE 1

要素数が255*1024*1024/4個なのは CL_DEVICE_MAX_MEM_ALLOC_SIZEが255MByteで、 それをfloat型(4byte)で使用している為です。
GPUのlaptimeはclEnqueueNDRangeKernel()とclEnqueueReadBuffer()の実行 時間を計っています。これは、clEnqueueNDRangeKernel()だけでは コマンドキューに入れるだけで計算時間は含んでいないようだったので、 結果を取り出すclEnqueueReadBuffer()までを含めたという感じです。
CPUのlaptimeはD言語の配列演算を使って1スレッドで求めた結果です。 core.simdは使用していません。
という訳で、このくらいの計算量であれば、CPUでSIMD命令を使うなりマルチスレッド化 なりをした方がトータル実行時間は短くなるようです。如何せん我が家のPCのGPUは IOデバイスのひとつなもんですから、データの移動時間が演算時間を上回ってしまうと台無し になります。なんでも速くなる訳ではないので扱いが難しいです。 そういえば、double型が使えるっぽい雰囲気があったので試してみたのですが ダメでした。精度が欲しいとなると急に話が難しくなるので、使えそうで使えない と思う人も居るやも知れません。

ちょろっとマンデルブロ集合のコードをOpenCLで書いてみました。 それとなく描けていそうという確認までしかできてなくて、 まだちゃんと比べていませんが、4096×4096ピクセル、倍率1.0で描くのに かかる時間は約1秒。以前作成したMandelbrotView では8CPU使用で約43秒かかりましたので、相当速く描けるという事は言えそうです。

2012/08/11

AM中に起床するも、ぐうたら過ごして終了。

ここ2週間ほどgdcに更新が無くて寂しいなぁと思ったり。

覚え書。Emacsでコマンドに引数を与えるとき、(universal-argument) を使用する。例えば「ハノイの塔」を10段にしたいとき、 「M-x universal-argument」を実行した後、「10 M-x hanoi」と入力。 デフォルトのバインドであれば、universal-argumentは C-u に 割りあたっているようですが、TANEはC-uを他のバインドに変更してある 為、ちょいと面倒臭い感じになってます(^^;

もそもそとコーディング。なんとなく動く感じになったり。

2012/08/10

気持ち遅めに帰着。

Webをちょろっと巡回してたらあまりの眠さに急速停止。

2012/08/09

遅めに帰着。

眠くて死亡。

2012/08/08

日付け越え。

眠くて死亡。

2012/08/07

日付け越え。

眠くて死亡。

2012/08/06

日付け越え。

眠くて死亡。

2012/08/05

AM中に起床。ちょろり休出。

久保ミツロウ。いいとも(増刊号でしか見られませんが)に何度か出てるのを たまたま見てましたが、トークが面白いなぁと思いました。

「それ町(10)」。安定してます。

2012/08/04

昼ごろ起床。ちょろり休出。

そういや、王様のブランチの総合司会を務めている本仮屋ユイカが、 映画スウィングガールズの関口香織役(トロンボーンのメガネの娘) だというのに初めて気づきました(^^; てか、全く判らなかった(^^; スウィングガールズ公開が2004年で今から8年前か.....とは言え、 上野樹里が今もそんなに変わらない方が不思議なのだろうか?

ちょろり本屋に。色々仕入れたり。

「ONEPIECE(67)」。仕込みが満載という感じ。

DMDの2.060がリリースされている模様。gdcに来るのはまだ先か。それよりも MinGW向けにはまだ2.059も来てないのに。gdcが少々ややこしい感じに なっているのは、メインラインの対応が開発版のgcc-4.8向けにしかメンテできて いないという所かも。現行リリースのgcc-4.7.x向けにすらブランチが 切られていて、「最新のgdcをgcc-4.7.xをベースにビルドしてみたが コンパイルエラーになるのは何故だ?」という状況です。あと、MinGW 向けには、現行のMinGWに対して追加する形でバイナリ配布を行っている都合で gcc-4.6.1をベースにせざるを得ない状況になってます。しかし、 gdcのメインラインは4.6.x以前のバージョンのサポートを打ち切っている為、 MinGW向けの修正がメインラインに反映されにくい感じにもなっているようです。 うまくまとめてくれないかなぁ?と思います。

「ハイスコアガール(2)」。続きが気になる感じ。てかもう2刷になってる。

2012/08/03

日付越え。

ちょろっとWeb巡回して終了。あまりの眠さに急速停止。

2012/08/02

日付越え。

ちょろっと調べ事をして終了。

2012/08/01

遅めに帰着。

ちょろっとWebを巡回して終了。


TOP PREV