No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1259 | 1260 | 1261 |...| 1267 | 1268 | 1269 || Next»

グリチャレほぼ全部のCPU使用

とりあえずほぼ全てのCPU(約950)を用いてプログラムを動かすことに成功.ただ,スピードはそれほど向上していないのでどこかにボトルネックがあるらしい.とりあえずレプリカファイルを使うように改良してみて,それでも遅かったらクラスタの結果を送信するプロセスが一台しかいないのを複数台に拡張しようかなぁ.

確定申告行ってきた

朝一で確定申告に行ってきた.

税務署一階で提出を受け付けており,二回が申告書作成会場となっていたため,とりあえず申告書を作るために二回の会場へ赴いた.朝早くのためかそれほど込んでおらず,数分待たされた後に申告書の作り方を教えてもらえた.とはいっても,「全部還付されます」といわれた後にタッチパネルで金額とかを入力してプリンタでプリントアウトしただけだけど.うーん,結構楽にできるものなんだなぁ,ととりあえずは関心(オンラインのほうが楽だけど).あとは第一表に還付金を受け取る口座を記入して住所と名前を書いて印鑑を押して,第二表も住所と名前を書いて,さらにその裏に源泉徴収表を貼り付けて完成.帰りに一階の提出場所で提出して確定申告終了.

で,件の研究補助金は何の収入になるかというと,公的年金等以外のその他の雑収入になるらしい.ただ,これに関しては経費がどーたらで収入から消せるような感じだったのだが,忙しそうだったので細かいことは聞かなかった.来年までには調べておこうかと思う.まあ,なんにせよ,これで来年はあらかじめ作成した申告書を提出できるので良し.

ちなみに,うちから税務署までは一分もかからない距離だったりする.年に一回お世話になるかどうかわからないけど,近いことはいいことだ.

税金を還付してもらわねば

ふと思い出したけど確定申告すれば税金が帰ってくるんだよね.

ということで,明日は確定申告行き.ちなみに,最近は便利なようで国税庁のホームページ上で確定申告書の作成ができるらしい.しかし,研究補助金(科研費)が何の収入になるのかわからんため自力では作成できない.今後のためにも明日税務署の人に聞いてくるとしよう.

永夜抄Hardアリア

やっとこ冥界組でHardクリアでけた.この調子でLunaticも行きたいところだけど... そのまえに霊夢単体Hardクリアせねば.

screen

最近 screen は良いよとの話を何度か振られたので,試しに使ってみることにした.でもまあ,使い方も良くわからんのでとりあえず使い方の乗ってるところをリンクしてみる.

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/692usescreen.html

http://www.ayu.ics.keio.ac.jp/members/mukai/tips/screen.html

結構高機能のようで,ターミナルを切り替えられたり前の状態をレジュームできたりするらしい.とりあえず,ログアウトしてもプロセスを走らせっぱなしにできるのはありがたい.これからちょっと設定の仕方を学んでみよう.

if を消去

グリチャレのプログラムをさらに速くしようと,徹夜で研究室のドクターと一緒にプログラムを改良してみた.

ビット操作でちまちまやっていたのを一部バイト操作に置き換え高速化していたのだが,とりあえずそれを全体的にバイト操作にすることで倍以上のスピードアップを達成した.これに関しては誰もが思いつく単純な改良であり,これだけではつまらないと

少々壊れ気味の我々は続いてif 文を殲滅するという奇策に走った.よく知られていることだが,if 文とかでちまちまジャンプしまくるプログラムは遅くなる場合が多く,無駄な if を消すことは速度向上の上でとても好ましい(分岐したときにパイプラインで処理されてたものを破棄しなければならないし).

というわけで我々も無駄な if を探してみたのだが,既にかなり最適化したつもりのコードなのでそんな無駄な if はもう既にない.でもまあ,必要そうに見える if はまだごろごろいるわけで,そいつをどうにかして殺したい衝動に駆られるのは自然な流れである.そして,我々はいくつかの必要そうな if を愉快な方法で抹殺することに成功した.

抹殺例の一つは以下のような感じである.この次の if で分岐する部分が,

     if(cnt < rem){
       *p = (*p << cnt) | (((1<<cnt) - 1) * bit);
       rem -= cnt;
    } else {
     *p++ = (*p << rem) | (((1<<rem) - 1) * bit);
     cnt -= rem;
     rem = 8-cnt & 0x7;
 }

次のようなわけのわからないコードに置き換わった.

    const int min = cnt - ( ( - 1 + ( ( unsigned ) ( cnt - rem ) >> 31 ) ) & ( cnt - rem ) );
    rem -= min;
    cnt -= min;
    const int isRem0 = ( -1 + ( ( unsigned ) ( -rem + 1 ) >> 31 ) ) & ( -rem + 1 );    
    *p = ( *p << min ) | ( ( ( 1 << min ) - 1 ) * bit ); p += isRem0;
    rem += isRem0 * ( 8 - ( cnt % 8 ) );

これにより if 文が抹殺され,実際に実行時間も少しばかり(このルーチンのクロック数で半分くらい)速くなった.

ここでの肝は, signed の x に対して, max(x, 0) = (-1 + ((unsigned)x>>31)) & x のようにif を用いずに max を表現できることだったりする.上の例ではこれを改良して, x>0 なら 1 を,そうでないなら 0 を返す演算を記述している.

このように,あほな努力でちょっとでも速くてとても読みにくいコードが出来上がるのはとても面白い.

«Prev || 1 | 2 | 3 |...| 1259 | 1260 | 1261 |...| 1267 | 1268 | 1269 || Next»
Search
Feeds

Page Top