W.Deeの2008年3月の日記

kikyou.info»日記

誠に勝手ながら、kikyou.infoは2017年12月いっぱいをもって閉鎖します。ながらくありがとうございました。

最新月 : 2008年10月
2003年 [             3    4    5    6    7    8    9   10   11   12  ] 月
2004年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2005年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2006年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2007年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2008年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2009年 [   1    2    3    4    5    6    7    8    9   10   11       ] 月
前月の日記  次月の日記

2008年3月26日

Risse進捗(26)

久しぶりに Risse を弄っていました。

RisseにPythonライクなパッケージの概念を導入しました。

概念としては、いままで一つだけだった global が、パッケージごとに存在することになります。パッケージごとに global、つまり大本の名前空間が別れているため、名前空間の衝突をあまり心配しなくて良くなります。

構文としては

import math;

のようにすると、もしmathパッケージに sin というメソッドがあれば

math.sin(f)

のように呼び出すことができるようになります。

as で別名を指定して

import math as m;

のようにし、

m.sin(f)

のように呼び出すことも可能です。

あるいは

import sin in math;

import * in math;

とすると、指定された識別子を直接インポートすることができます。この場合は math. をつけずに

sin(f)

のようにして直接呼ばれるようになります。

パッケージは階層を持つことができて、これはパッケージのおいてあるディレクトリの階層にマッピングされています。たとえばパッケージ検索パスに graphics/rina.rs というパッケージがあれば import graphics.rina; でインポートすることができます。この rina.rs はそのパッケージがどこかで初めて import されたときに、そのパッケージを global として1回だけ実行されます。

言語仕様上重要な Object や String などのクラスはすべて risse というパッケージに入っていると見なされています。すべてのパッケージは、その初期化の際、暗黙のうちに

import * in risse;

が実行されたかのように振る舞います。つまり、risse パッケージにあるすべての識別子が自動的にインポートされます。

実のところ import 文は this::import( ) の呼び出しをコンパイル時に生成する糖衣構文です。this はトップレベルの場合 global ですので、トップレベルに import 文を書いた場合は global::import( ) が呼ばれることになります。

import は Object クラスで定義されているので直接呼び出すことが可能ですが、引数の形式がかなり複雑なので import を使った方が楽でしょう。

また、この性質から、

class C {
  import * in math;
}

のようにしてクラスメンバとしてパッケージをインポートすることができます。

2008年3月13日

嫁っこホスィ

( ゚Д゚)ホスィ・・・

  • 2008-03-20 18:10 ハロ : 俺もホスィ
  • 2008-03-21 03:12 ゆーしぃ : 私もホスィ…
  • 2008-03-21 14:16 京 秋人 : いい子見つけたら紹介します。調教は済ませておきますね>w<
  • 2008-03-21 20:17 sayo : わたしは婿っこホスィ
  • 2008-03-22 19:14 W.Dee : ひんぬーツインテールニーソプログラマー美少女きぼんぬ
  • 2008-03-22 19:15 京 秋人 : ポリゴンで作ったら進呈しますね>ひんぬーツインテールニーソプログラマー美少女
  • 2008-03-23 16:56 ハロ : じゃぁ俺、実体化モジュール書きますね。
  • 2008-03-24 00:14 パピコ : じゃぁ、動作させるためのサーバリソースとネットワーク提供しますね。
  • 2008-03-24 21:10 W.Dee : ううう、みんな、みんな、、、、ありがとうよ?
  • 2008-03-26 00:19 Miliardo : そういえば、もしその子がハックされたら、大変なことになりそうね。\\( ̄ ▽  ̄)/ヤンデレ化かも?
  • 2008-03-28 23:24 W.Dee : 望むところですがそれより中身スカスカなほうが気になるポリゴン空気嫁

2008年3月12日

gcc4.3 出た

出たけどここで書いたやつはあんま状況が変わってない模様。4.2よりは良くなってるけど、まあ、駄目という判断。あれ、これループが展開されちゃってるな。

SIMD以外の最適化がどう良くなっているのかはあまり見ていません。処理負荷が特に集中するグラフィック周りはどうしてもSIMDによる最適化をしなければならないので、そこが遅いと残念な気分なのです。

2008年3月2日

gcc4.2が変

gcc4.2でいろいろ試していたのですが、intrinsicを使って書いた MMX 用コードが C 言語版コードより遅かったです。そのときは「そういうこともあるだろう」と思って気にしなかったのですが、別のコードを MMX/SSE 用に書いたら、これまた遅い。

コンパイラの吐いたコードを見てみると、ものすごい量のローカル変数への load と store。MMXレジスタなんて mm0~mm2 の3つしか使ってない。いちいち結果をメモリに store しているなどなど。

奇妙に思って こういうソースコード を -masm=intel -O3 -march=athlon64 -mtune=athlon64 でコンパイルしてアセンブリ言語を出力させてみると

ということで、見た感じ、コード品質は gcc4.2.1 << gcc3.4.5 < gcc.4.1.2 の予感。

実際に TLG6 のデコーダで使われているコードでベンチマークを走らせてみると、この MMX/SSE を使った該当部分、 gcc3.4.5 で作成したバイナリでは 1100ms で終わる処理が、 gcc4.2.1 で作成したバイナリでは 1800ms ほどかかります。ちなみに gcc3.4.5 で吐いたバイナリの速度は手書きでアセンブリ言語で書いた TLG6 デコーダの該当部分と互角の速度のよう。

新しいバージョンでは改善してるのかなとおもって、 ここに gcc43-20061204.tar.bz2 という gcc 4.3.0 のバイナリがあったので それで試してみると gcc4.2.1 とほぼ同じコードを吐きました。

うーーん、まいった。新しいバージョンのコンパイラで改善しているならばまだ良いんですが 4.3 のバイナリでも改善してないとは。いや、4.3 まだ正式には出てないので本当のところどうなっているのかはチェックしてないですけど。

gcc3.4.5 に戻るという手もありますが、吉里吉里3が正式にリリースされる時期に見合ったコンパイラを使いたいですし、わざわざ古いコンパイラに戻るのもどうかなぁと。あるいはここだけ古いコンパイラを使うとか? なんか全然シンプルな解法じゃないですね。

どなたかここら辺の事情をご存じの方いらっしゃいますか。

  • 2008-03-02 19:09 e : gcc-4.2はかなり前からパフォーマンスに関する悪評があり、実際4.1よりかなり劣ります。利点としてはOpenMPに正式対応したぐらいか…。多くのLinuxディストロでは4.2を見送って4.1→4.3というアップグレードになってます。でも4.3もSIMDやtree-optimizationで色々問題を抱えており、解決するのは4.4以降になるだろうとの事。ここは4.1で留めておいてはどうでしょうか?3.3ほどではないにしても優れたバージョンだと感じます。
  • 2008-03-03 00:39 W.Dee : 情報ありがとうございます。そうだったのですか。4.1のmingw用バイナリ落ちてないかなと探してみましたが見つからず。MinGWのgcc4.2.xも生のgccのソースに対していくつか(特に例外処理関連で)パッチが当たってるらしくて、4.1系列にしても生gccソースじゃなくてちゃんとパッチをあててからコンパイルしたい(あるいはパッチの当たったものを使いたい)とおもってニュースアーカイブなど漁っていますがみつからず………
  • 2008-03-03 06:54 e : \"mingw gcc-4.1.2\"でぐぐってみましたが、ここのじゃ駄目ですかね?http://www.develer.com/oss/GccWinBinaries 後は自分でソースから組み立てってのもありますが…
  • 2008-03-04 23:31 W.Dee : そこのリンク先にある http://www.tdragon.net/recentgcc/ TDMのgccをとってきて試しています。そこの説明にもありますが、このコンパイラの吐いたバイナリはDLLをまたがった例外処理ができません(MinGWオフィシャルなヤツはローカルパッチでこれに対応しています)。いま作ってるソフトは最終的にコンポーネント別にDLLで分けてプラグインする方式をとるつもりなのでちょっとまずいかもしれません。ただ、それをテストしなければならないのは相当先の話になると思うのでとりあえずはこのコンパイラで我慢しようかなとおもいます。