ナンクル力学系

学んだ事を書き連ねていこう。

ブログをGitHubに移動しました

leave a comment »

去年はほとんど書いてませんでしたが、今年はちゃんと書こうかなってことで(?) ナンクル力学系@GitHub に移動しました。

よろしくお願いします!!

Written by tkf

April 17, 2011 at 12:44 am

Posted in 研究日誌

RailGun: C+Pythonでお手軽に数値計算プログラミングを加速させるライブラリ

leave a comment »

シミュレーションのプログラム書く時に,毎回同じようなコード書くのが嫌なので作ってみました.とりあえずドキュメント書いてみたから使ってみてよ!

Written by tkf

October 15, 2010 at 4:08 am

Posted in 研究日誌

Tagged with , ,

Cの配列はa[i][j]とa[i*Nj+j]のどちらが速いか試してみた

with 2 comments

Cでベクトル演算沢山やるような数値計算をするときに多次元配列を a[i][j] と a[i*Nj+j] の どちらで書くのが速いか気になったので試してみた.(Njは添え字jの数ね.) x 始めは,

と思ってたけど,

とか良くわからないなと思ってたら

と教えてもらって,一筋縄な問題じゃなさそうだと思ったので.

サンプルで作ったのはのRNN(recurrent neural network). ソースは gist: 267098 – GitHub にある.結構キモいソースだと思うw.

1次元配列での実装(a[i*Nj+j])を rnn_ca1d.c に, 2次元配列での実装(a[i][j])を rnn_ca2d.c に書いてある.

rnn_ca1d.c は配列にアクセスするためのマクロを:

#define Wcc(i,j) self->wcc[ self->num_c*(i) + (j) ]
#define Bc(i)    self->bc[(i)]
#define Ec(i)    self->ec[(i)]
#define Uc(i,j)  self->uc[ self->num_c*(i) + (j) ]
#define Xc(i,j)  self->xc[ self->num_c*(i) + (j) ]

で書いていて, rnn_ca2d.c は:

#define Wcc(i,j) self->wcc[i][j]
#define Bc(i)    self->bc[i]
#define Ec(i)    self->ec[i]
#define Uc(i,j)  self->uc[i][j]
#define Xc(i,j)  self->xc[i][j]

で書いてある.あとの内容はほとんど同じ.

rnn_ca1d.c と rnn_ca2d.c を gcc と icc でそれぞれ -O2(デフォルトなはず) と -O3 オプションをつけてコンパイル.そして,実行時間を計ってみたのが以下:

tkf% make runtest 2> runtest.txt
for i in  rnn_ca1d-gcc-O2 rnn_ca1d-gcc-O3 rnn_ca1d-icc-O2 rnn_ca1d-icc-O3 rnn_ca
2d-gcc-O2 rnn_ca2d-gcc-O3 rnn_ca2d-icc-O2 rnn_ca2d-icc-O3; \
        do \
        printf "%s %d %d %d " \
        ./$i 30 1000 300 1>&2; \
        time ./$i 30 1000 300; \
        done
tkf% cat runtest.txt
./rnn_ca1d-gcc-O2 30 1000 300 1.65user 0.00system 0:01.65elapsed 99%CPU (0avgtex
t+0avgdata 0maxresident)k
0inputs+0outputs (0major+272minor)pagefaults 0swaps
./rnn_ca1d-gcc-O3 30 1000 300 1.56user 0.00system 0:01.57elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
(略)

結果が分かりにくいので整形してみる:

tkf% sed -e "N; s/\n//" runtest.txt | cut -f1,5 -d' '
./rnn_ca1d-gcc-O2 1.64user
./rnn_ca1d-gcc-O3 1.56user
./rnn_ca1d-icc-O2 0.80user
./rnn_ca1d-icc-O3 0.80user
./rnn_ca2d-gcc-O2 1.48user
./rnn_ca2d-gcc-O3 2.62user
./rnn_ca2d-icc-O2 1.07user
./rnn_ca2d-icc-O3 2.23user

分かることは,

  • icc で1次元配列(a[i*Nj+j])で実装したバージョンが一番速い.
  • 2次元配列(a[i][j])での実装は,gcc/iccのどちらでも -O3 の パフォーマンスが落ちる.不思議.
  • gcc -O2 だと,2次元配列(a[i][j])のほうが若干速い.
  • ※ 3回試してほとんど同じ結果だった.

ちなみに, make の時に出たメッセージを見ると2次元配列(a[i][j])での実装を-O3で コンパイルするとベクトル化されてるループが少ないことが分かる:

tkf% make all
gcc -lm -O2 rnn_ca1d.c -o rnn_ca1d-gcc-O2
gcc -lm -O3 rnn_ca1d.c -o rnn_ca1d-gcc-O3
icc -vec-report1 -O2 rnn_ca1d.c -o rnn_ca1d-icc-O2
rnn_ca1d.c(65): (col. 3) remark: ループがベクトル化されました。.
rnn_ca1d.c(67): (col. 5) remark: ループがベクトル化されました。.
rnn_ca1d.c(67): (col. 5) remark: ループがベクトル化されました。.
rnn_ca1d.c(20): (col. 3) remark: ループがベクトル化されました。.
rnn_ca1d.c(39): (col. 5) remark: ループがベクトル化されました。.
icc -vec-report1 -O3 rnn_ca1d.c -o rnn_ca1d-icc-O3
rnn_ca1d.c(65): (col. 3) remark: ループがベクトル化されました。.
rnn_ca1d.c(67): (col. 5) remark: ループがベクトル化されました。.
rnn_ca1d.c(67): (col. 5) remark: ループがベクトル化されました。.
rnn_ca1d.c(20): (col. 3) remark: ループがベクトル化されました。.
rnn_ca1d.c(39): (col. 5) remark: ループがベクトル化されました。.
gcc -lm -O2 rnn_ca2d.c -o rnn_ca2d-gcc-O2
gcc -lm -O3 rnn_ca2d.c -o rnn_ca2d-gcc-O3
icc -vec-report1 -O2 rnn_ca2d.c -o rnn_ca2d-icc-O2
rnn_ca2d.c(69): (col. 3) remark: ループがベクトル化されました。.
rnn_ca2d.c(71): (col. 5) remark: ループがベクトル化されました。.
rnn_ca2d.c(20): (col. 3) remark: ループがベクトル化されました。.
rnn_ca2d.c(39): (col. 5) remark: ループがベクトル化されました。.
icc -vec-report1 -O3 rnn_ca2d.c -o rnn_ca2d-icc-O3
rnn_ca2d.c(20): (col. 3) remark: ループがベクトル化されました。.
rnn_ca2d.c(39): (col. 5) remark: ループがベクトル化されました。.

iccの-O3オプションって-O2プラスアルファだと思ってたけど違うんだろうか. まあ,一次元配列で実装してれば問題ないことが分かったので良しとしよう!

あと,どの配列実装が速いかはたぶん計算に依存してるだろうから,この結果は 他の数値計算に適用できないと思う.これを書いてるときにちょっと添え字の 書き方間違えてて,その時の結果はかなり違ったし.だから,こういうテスト はなるべく実際の計算に近いソースで試すべきなんだろうな. 普通に行列xベクトルの計算プログラムじゃなくてRNNで試して良かった.

Written by tkf

January 1, 2010 at 11:00 pm

Posted in PC

Tagged with

英語で履歴書(Curriculum Vitae, CV)書くときに見てたページなど

with one comment

最近周りでCV書くよっていう人が居たので書いてみる(blog書くの久しぶりすぎる).

でも良く考えたら,一番参考になったのは,というかお世話になったのは添削してくれた 知り合いなので,これだけ見て履歴書を書くのは大変かもしれない. でも,最初は色々サンプル見て感じをつかむのが良い気がする.

ここまで書いてて気づいたんだけど,↑のページは全部 .uk だ. もしかしたらアメリカとか他の国だと情況が違うかもしれないので注意したほうが良いのかも. でも Academic CV なら大体同じかも.(無責任すぎる...)

他には,LaTeX 関係など:

おまけ:

Written by tkf

December 30, 2009 at 9:30 pm

Posted in Uncategorized

Tagged with

Waseda.L#2 メモったやつ

leave a comment »

1 とりあえずメモだけ

2 ニューラルネットワークを分かった気になる30分 by @tkf

  • 1時間くらいかかった
  • 絶望した

     

3 人力飛行機の尾翼の非定常特性 by @t_mania

3.1 研究背景

  • 記録向上,自己も増加
  • 墜落の原因
  • 構造,操縦,体力
    • 構造で壊れる90年代,操縦で落ちるここ3大会
    • 彦根プリンスホテルに向かって落ちていく

3.2 人力飛行機の操縦性

  • 尾翼だけで操縦
  • パワーによる迅速な調整が困難
  • 飛行速度が遅い

3.3 全可動翼

  • 前縁が動くことにより,剥離しやすい

3.4 実験条件

3.5 静特性

  • 揚力が鈍るポイントで効力がちょっと上がる

3.6 迎角を減少させると,迎角によってはヒステリシスある

3.7 減少させる時には減少させすぎるくらいやったほうが剥離もどって良いかも

4 光IC技術周辺 by @ashula

4.1 Siフォトニクス, “Si photonic wire”, シリコン細線光導波路

  • 光ICの配線基盤技術
  • CDの裏くらいにキラキラしてる

4.2 データ伝送の高速化の限界

  • トランジスタ数はムーアの法則
  • クロック周波数はもう上がらない
  • データ量(NW基幹ノードで処理するデータ量)が2倍/2年

4.3 シリコン細線光導波路

  • 曲げについての解析
  • コアとクラッドの屈折率
  • 曲がる回数の足し算ではない

4.4 シミュレーション

  • 2Gx8 で一日

4.5 損失が足し算では無い場合

  • 階段状24段
    • 曲率変化する部分を換算すると,実測値によくあう

5 救急医療支援ロボットテクノロジー by @ron_taa

5.1 da Vinci, Open MRI, 腹 鏡手術

5.2 救急医療支援RT

事故から治療まで平均33.4分かかる

5.3 ショック=循環動態の異常

  • 胸 内に
  • 片方の肺がやぶれる.

5.4 救急医療のロボット支援

  • ロボットAIDED
  • 体表面装着部が吸盤.真空吸盤.

5.5 肋骨の間に差さなければならない.せんし点.

  • どうやって探す?
  • エコー画像を遠隔地のお医者さんに見てもらう

5.6 せんし自動化機構

  • 硬い針とまわりの柔らかな筒
  • ワンウェイクラッチで,モーターひとつで制御
  • 流量センサを見て,針をぬく

5.7 救急医療のロボット支援は25年前にアメリカでは否定されている

  • アメリカの救命士(Paramedic) と救急救命士では出来ることが違う
    • グレードの高いParamedicではせんし出来る
  • 救急医療ロボット支援の研究が

5.8 Conclusion

  • 救急医療ロボット支援はタフな分野
  • 制約条件も多い.狭いスペースなど.
  • 日本だから発展しうる分野?

5.9 質問

  • 法律かえれば?
    • RTは救命現場で医者・救命士間の意思疎通のコストを下げることが出来る.
    • 一概に,法律を帰れば良いとは言えないのでは.

6 耐故障性航空機の風洞実験 by @salamann

6.1 自己紹介

  • キーワード:jk

6.2 専攻のプロジェクト

  • 飛行機が壊れたときに制御系を補正して飛べるように
  • パイロットの負担が減る
  • 機体はビジネスジェット形状

6.3 風洞

  • 翼端が取れている模型

6.4 alpha 変化

  • CL 揚力が落ちる
  • CD 抗力は下がる
  • Cn ヨーモーメントが少し出る

    …けどまあ置いておく

  • Cl 予想通り,大きなモーメント

6.5 beta 変化

  • Cl
  • エルロンきってもどせる? -> alpha=5度あたりから難しそう

6.6 わかったこと

  • エルロンだけだとけっこう厳しくなる

6.7 懇談会

今日も外で飲みたいな

Written by tkf

November 22, 2009 at 2:15 am

Posted in 研究日誌

Python で RNN (PyRNN) を書いたので公開します

with 2 comments

ソースはBitbucketに置いている. > tkf / PyRNN / overview — bitbucket.org

何が出来るかというと,こんなのとか(インパクトが欲しかったので,学習の様子をアニメーションにしてみた):

左上がエラーの学習曲線,右上がパラメタのRMSの学習曲線,左下が教示信号とネットワーク出力の相空間プロット,右下がコンテキストの相空間プロット.このアニメを作るソースはこれ(が吐いたpngをconvert -delay 5 *.png nn.mpgで変換).

これを作った理由は,Pythonだと簡単に式を書けるからバグ入りにくい,だからCで書いた本番用のテストに使える!と思ったから.だから,かなり計算効率は悪いけど分かりやすい書き方になっている(はず).これを使って本番用のネットの一つバグが落とせたのはかなりうれしかったけど,その本番用のはラボにいる別の人のより性能悪いっぽいので両方共にバグがあるかも(おいw

という訳で,バグレポートお待ちしてます!←ココ!

あ,簡単なネットワークの式はPyRNN v0.0 documentation で説明してます.

追記

  • README.rst にインストール方法書いてるけど,実はインストールしなくても使えます. toy/ElmanNet に色々遊べるスクリプトがあるので,それを一番根元のディレクトリ(setup.py がある場所)にもってきて実行すればおk(なはず.
  • numpy と matplotlib が必要です.
  • アニメの再生速度はlog scale(っぽく)速くしてます.実際は後半待つのが超ダルいです.
  • momentumという黒魔術項を入れて,ネットワークの学習を加速しますけどそのせいで暴れています.でも暴れているのを見るのが楽しいです.

Written by tkf

November 18, 2009 at 5:17 pm

Posted in 研究日誌, PC

Tagged with , ,

ローカルに Subversion のリポジトリを作る方法

leave a comment »

$HOME/tmp/svntest っていうディレクトリ以下に,リポジトリ repo1 を作って co1/repo1 にチェックアウトしてみた.

まずリポジトリを作る:

mkdir ~/tmp/svntest
svnadmin create $HOME/tmp/svntest/repo1

作ったリポジトリをチェックアウトして使う:

mkdir ~/tmp/svntest/co1
svn co file://$HOME/tmp/svntest/repo1 repo1
cd ~/tmp/svntest/co1/repo1/
touch README
svn add README
svn ci -m ""

Written by tkf

October 4, 2009 at 8:25 am

Posted in PC

Tagged with

Follow

Get every new post delivered to your Inbox.