停電も終わって、ネットワークも無事だったらしい。素晴らしい。
学校に行かなくて済んだ。
さて、ファイル名が取れない。というか、パスを抜くのが出来ない。どうすればいいんじゃろう。とりあえず正規表現でお茶を濁すか。
ドラえもんみた。うーん、別物。
IPAX の、私の発表の時間がちょっと移ったようです。
こんなんじゃ駄目だぼけー,と IRC でいわれたので,現実逃避気味に SimplePaste を改造してみる.ソースはこっち>http://www.atdot.net/sp/sp
なんとなく,ちょっと何かを作るために必要な機能が見えないことはないような気がしないでもない.
アトミックに扱える簡単なデータベースと,サービスのディスパッチャ,あと,ちょこっとの情報アクセス用の何か.
相変わらず眠い.
わーい.すぱーく.
わーい.出したー.
ここ最近はほんとに忙しかったので,GWは休むぞー.
YARV やろー.
そういえば学校で停電だそうで,atdot.net のサービスもとまるかもしれません.そのときはごめんなさい.
行ってきます。
行ってきました.
ミナミノミナミノ読了.まんまやん.
ミナミノミナミノはIPAに行って帰ってくる間に読めるのに,故郷から〜 は全然読めなかったなぁ.
ところ変われば論文スタイルも変わる.
論文の著者名では,私の場合
にしてるんですが,皆様のところではどうやってますか.
名前順? さすがに無いよな.
この日記を見ている人は猫好きが多いことがわかった.次は犬.
貢献した順、というところもある。偉い人が2番目とか。一番酷いのは誰が書いても偉い人が一番、2番目が発表するとか。サイテー
それはヒドイですね・・・.
情報系分野では「貢献順」という解釈はかなり妥当だと思うんですが。大学で研究者DB開発してるんですが、分野によっては単にアルファベット順というところもあったりするので驚愕。
物理の実験系等やたら人数多い分野はアルファベット順になったりするようですね。
物理の理論系だったけど、2人とか3人でもアルファベット順だったなあ。
なんか,もう色々と,駄目.
ある何かについて,従来手法 A では a倍,提案手法 B では b倍高速化,という結果が出たとする.
さて,結果はなんと書くべきか.順当に言って,A は B に比べ b/a 倍高速化した,というべきなんだろうが.a が 3.0,b が 3.1 のとき,とても悲しい.
こういう比較をするのが間違いなんだろうか.
アーキテクチャの提案において,3% 性能向上というのはどの程度のものなんだろう・・・.
これだけ延々とサンプルプログラム書いてると,勘所というか,どこでどうやって並列化処理をはさめばいいか,ってわかるようになるなぁ.
LLDN はいいんだけど,あの女性は何者...
まつもとさんを NaCl としか書かずに出しちゃったんだけど,どっかの大学の肩書きは要らなかったんだろうか....
さて,論文がやっとある程度まとまったので(28締め切りである程度ってどういうこっちゃ),頭を ruby-mode に切り替えないと.
明日は大事な日だ.いろんな意味で.
2%クラブってのが無かったっけ。2%の向上を、5回やれば10%向上。
かりかりかりかりチューンしてくと、プロファイラの出力も上から"2%"がずらーと並ぶようになって、どこをどういじっても一回毎の改善が1%台ってことになっちゃうんだけれども。そのくらいの改善になるとノイズを排除するためにテストパターンも試行回数も無闇に増えて、検証にかかる時間ががんがん増えて行く。この耐久レースについて行けるのは、競争に勝つために開発リソースをがんがん増やせる大企業か、実質的に時間単価をがんがん減らせる学生か…
ぅぁー
この部長のテンションの感じは駄目だと思う。もっと爽やかに「おっくれってるー」と言わないと。
全体的に勢いが足りないと思う。よろしくない。顔もなんか違う。
やっぱ文字で見るのがいいなぁ。
鼠と竜のゲーム読了.なるほど,詩人かぁ.
投票を見ると,ナチのスパイはいないらしい.
水がどうの,じゃないから大丈夫か.
amazon さんキター.
http://www.hpcc.jp/swopp/swopp2005/cgi-bin/swopp_app_summary.cgi
16件を全部やろうとすると12時間(休みなし).3日で分けても一日4時間.
そういえば,Java プログラミングの処方箋を購入.いつサインをもらえばよろしいでしょうか :)
私のタイピングって非常にだめだめで,右手小指とか使えません.だからセミコロンも人差し指で打っている.ピリオドも人差し指で打ってるなぁ.人差し指大活躍.
直したら,もっと速く打てるようになるのかなぁ.
Java に volatile があるのを知らなかった.しかし,使用場面がわからん.いや,使用しなければいけないところはわかるんだけど,なんで必要なのかわからん.
そうか.Java bytecode 単位で考えてもわかんねーはずだ.JIT compile の話なのね.
うぅ,脱線事故がこんなにひどい事故だったとは知らなかった.
おお、どうもありがとうございます。IPAXって平日だからな……
ちなみになぜ昨日の日記のバグに気が付いたかというと,シミュレータの上で走らせてるんですが,L1D キャッシュヒット(h),ミス(m) 回数が出るんですな.で,h+m の値がカナーリ違っていて.多少の違いはスタックとか,制御領域のアクセスがあるんで違うんですが,カナーリ違うとダメダメで.
いや,便利といえば便利.
空が白んできたよ.
論文よりも,長い目で見たらきっと大事なものの準備もしなくちゃだよ.
そして,真っ白(いや,背景色は黒な xyzzy だけどさ)な論文.
ウワーン.
#define FETCH_AND_DEC(var_addr) \
{ \
asm volatile( \
".set noreorder\n" \
"li $8, 1;" \
"1:;" \
"ll $2, (%0);" \
"sub $2, $2, $8;" \
"sc $2, (%0);" \
"beqz $2, 1b;" \
"nop;" \
: /* output */ \
: /* input */ "r" (var_addr) \
: /* broken */ "$2", "$8" \
);}
....
FETCH_AND_DEC(&g_rest);
if(g_rest== 0){
バリア解除処理
}
間違いを指摘せよ(3点).
いやー,よく動いてたな.感動.
・・・全部書き直し.
ぁぅぇぅ.
書きたいことは沢山あるんだけどなぁ.書ききれないなあ.
GW イベント目白押しだなぁ.
でも,家でずーっとだらだらしてそう.って,いつもと同じじゃん.
ふと,自分でレジスタ指定するよりも,全部 gcc に任せたほうがよかったなぁ,と思った.
#define FETCH_AND_DEC(var_addr, old_var) \
{ \
asm volatile( \
".set noreorder\n" \
"li $8, 1;" \
"1:;" \
"ll %0, (%1);" \
"sub $2, %0, $8;" \
"sc $2, (%1);" \
"beqz $2, 1b;" \
"nop;" \
: /* output */ "+r" (old_var) \
: /* input */ "r" (var_addr) \
: "$2", "$8" \
);}
よりも,
static int
FETCH_AND_DEC(int *addr){
int old_var, tmp_var;
asm volatile(".set noreoder\n"
"1:;"
"ll %0, (%2);"
"sub %1, %0, %3;"
"sc %1, (%2);"
"beqz %1, 1b;"
"nop;"
: "+r" (old_var),
"+r" (tmp_var)
: "r" (addr)
"r" (1));
return old_var;
}
tmp_var は output に入れなくてもいいような気がするな.
目があかんくなってきた.
IPAX の大量の招待券が来た。これをどうしろというんだ。
誰か、要る? タイムインターメディアにどかっと持っていくかなあ。
学校の机の上が大変なことになっている。なんとか資料を整理しようと思ってるんだが・・・。
ちなみに、家の机の上はもっと大変なことになっているんだが、見ないふり。
そういえば、先日森さん(LSI-C 作った人)としゃべってたんだけど「高橋メソッドって(略)」と言われた。
花見で使ったシートを干していたのを忘れていて夜回収。
しまった。コーヒー切れてたんだ。
proc1(int self){
int start = MAX/PC_NUM * self;
int end = MAX/PC_NUM * (self+1);
TYPE result = 0;
int i;
for(i=start; i<end; i++){
result += A[i] * B[i];
}
}
と、
proc2(int self){
TYPE result = 0;
int i;
for(i=self; i<MAX; i+=PC_NUM){
result += A[i] * B[i];
}
}
ベクトルの内積を求めるプログラムを並列化する proc1 と proc2(これらの関数が PC_NUM分並列に走る)ですが、どっちが速いでしょう。キャッシュのヒット率に気をつけて答えてください。
ちなみに、キャッシュは 2way set associative。
TYPE はとりあえず double。
いや、proc2 のほうが速いと思ったんだよー。なんで proc1 のほうが速いのー。何を間違えてるんだろう。俺。
proc1 よりも proc2 のほうが、キャッシュのミス回数が多い。なんで?
なんとなく、仮説はたったんだが、うーん。本当かなあ。
そういえば、「故郷から10000光年」やっと読み終わった。すげー読みづらかった。何個か飛ばしちゃったし。
すみません,大事なことを書き忘れていました.並列単位はそれぞれキャッシュを共有します.この条件がないと,全然違う話になっちゃいますね.
proc3(int self){
TYPE result = 0;
int i, t;
for(i=ITER*self; i<MAX; i+=ITER*PC_NUM){
for(t=0; t<ITER, i<MAX; t++, i++){
result += A[i] * B[i];
}
}
}
でxx(論文ネタ)すると速いことが発覚.
まぁ,世の中そんなもんだよな.
あれ,おかしいな.こういうことを紹介する論文じゃなかったはずなんだけど・・・(というかか,こんなんじゃ駄目だろぅ).
というか,xxなんて,もう既にきっと発表されてるんだろうなぁ・・・.でも,探したところ,見つからなかったし.うーむ.
要するに,並列単位あわせてのワーキングセットを狭くしたいんですよ.キャッシュを共有するから.
で,ブロック分割型の並列化は,ワーキングセット広くなっちゃうよね,だから狭くしたほうがいいんだよ,というのが1997年の論文に出ているのです.
そんなこと気にしたくネーヨ,という人は,キャッシュなんか共有しちゃいけないのです.で,そうやってる Intel HyperThreading なプロセッサはダメダメなのです.いや,使う側が,って意味だけど.icc は随分この辺を頑張ってる(はず)なんだけどね.
で,proc1 よりも proc2 のほうが遅くなったのは,proc2 だと各並列単位で変なところを指しやすくなる(不確定)ので,ワーキングセットが大きくなるからだと思う.
では,なんで proc3 だと速くなるのか?
答え.各イテレーションが ITER だけ短くなるから.ウワーン.
正しくはこちら.
proc3modified(int self){
TYPE result = 0;
int i, t;
for(i=ITER*self; i<MAX; i+=ITER*(PC_NUM-1)){
for(t=0; t<ITER, i<MAX; t++, i++){ // ここで i+=ITER していた
result += A[i] * B[i];
}
}
}
そんなことより関数の型をちゃんと書いてください
ちゃんと考えてないけどproc1のほうがふつーに速いんじゃないのか、という気がするが。空間的局所性とか。false sharingとか。
キャッシュラインサイズ(特に 2 次キャッシュの方)が分かりませんが、配列A[i], B[i] を read したときに配列の後続のデータもキャッシュ(prefetch)されますが、proc2 のように cyclic にアクセスすると、キャッシュ(prefetch)した効果がなくキャッシュミスが proc1 より多くなるかと。
みんなハッカーについてばかり書いていたのでつい。
論文は何時書くんだ・・・。
スゲェ! と思っていた手法が、実はぜんぜんすごくなく、ただの評価対象のミスだったことが発覚。
もうだめかも。自分がだめだっただけなんですが、かなりへこむ。
あれぇ、そのまんま Rails で合宿やるのか。Rails に対抗してなんか別のでって聴いた記憶があるんだけど。気のせいだったか。
VEE いきてー。シカゴー。いきてー。
注目はもちろんこれですな。
Virtual Machine Showdown: Stack Versus Registers Yunhe Shi, David Gregg, Andrew Beatty, M. Anton Ertl
Dynamic Languages Symposium 2005 かぁ。投稿締め切りは6月かぁ。微妙に現実的ではありそうなんだけれど。英語だしなぁ。そもそも、ページを見る限り、実装よりも理論系っぽい。でも、PCを見ると、実装の人が多いような。
見に行く気はまんまんなんだけど。
・・・行けるだろうか。
昼飯は食パン3枚。寂しい。
いろいろと、鬱。
10時。学校に戻り。
疲れすぎて倒れてた。お家に帰りたい。せめてご飯食べたい。
IPAX2005 で、YARV の話をするらしいんですが、こんな感じのようです。
初日なんて誰も来なさそうなので、好きなことが喋れそうです。
この日程なら、SACSIS の懇親会だけでも潜り込めるかなあ。
さて、猫好きはどれくらいいるのか(投票)。
IPAX 用にパネルを作る金なんて無いので(3万くらいかかる)、模造紙を持っていくことになるんだが、さて模造紙なんて貼ることはできるのか。
コードコンプリートの領収書を貰うのを忘れていたことに気づく。やっちまった。
無事貰うことができた。税金対策。
高橋さんが3人いた(高橋メソッドを知っていますか?)。
本棚.org に課題図書を移そうかと思って、ちょっとやってみたんだけれど、ぱっと見て使いづらそうなので、躊躇中。本の集合に対する見え方が弱い、ということだろうか。
うう。ついついブギーポップ・バウンディング ロスト・メビウスを読み終えてしまった。
なんだかよくわからなくなってるなぁ。そもそも、最初のほう覚えていないし(あの頃は立ち読みだったので)。しかし、よく続くよな。
しかし、なぜ皮の首輪>表紙
ふと、こんなものを考えてみた。
class Object
def method_missing selector, *args
if /is_a_(.+)/ =~ selector.to_s
if eval($1) === self
true
else
false
end
else
super
end
end
end
p( ''.is_a_String) #=> true
p( 1.is_a_String) #=> false
p( 1.is_a_Fixnum) #=> true
使えそうにないなぁ。
class Object
def self.inherited subclass
Object.module_eval %Q{
def to_#{subclass.name}
self.to_s
end
}
end
end
class C
end
p 1.to_C #=> "1"
どんなときに嬉しいんだろう。
SPEC CITN 92 が欲しいよう。
main(){
int a[] = {0,1,2,3};
printf("%d\n", a[1 ,2]); //=> 2
return 0;
}
20票はありえない。
ひとめあなたに、読了。読みやすかった。面白かった。
でも、アンテナがずれてたのか、強い衝撃は受けなかったなぁ。
読みやすい、と感じたのは「故郷から10000光年」を読んでいるからというのもあると思うのだけれど。「われらなりに、テラよ、奉じるはきみだけ」まで読んだけど、読んだ気がしない。読めた気がしない。
あんまり、「狂人」と言っている人たちが「狂人」に見えなかったからかも。
ipsj に投稿する論文は、自動生成じゃ難しいだろうなあ。
今日の生協。
たけぇ。
http://www.itmedia.co.jp/news/articles/0504/18/news034.html
Adobe Flash かー・・・。
RHG 読書会から帰宅。楽しかったです。arton さん、本当にありがとうございました。
家に帰れなさそうだったので、学校に帰る。大量の課題図書とともに。
そういえば、IORCC ってどうなったんだろ。サイトにもつながらないし。
strlen とか、strcmp の並列化とか、そういうのをやっているところってあるんかな。
どっちもループの依存関係が(終了するかしないか以外ない)ため、並列化してもしょうがないか。
メモリアクセスとか直列化しそうではある。
評価の結果は、微妙。うーむ。
よくなってたりはするんだけれども。うーむ。
Intel も Dual core か。どんなアーキテクチャにするんだろうなぁ。
[langsmith:197] C#の匿名メソッド..なぜ、ローカル変数を共有するのか?
より、
delegate void D();
class Test
{
static D[] F() {
D[] result = new D[3];
int x=0;
for(int i=0;i<3;i++) {
int y=0;
result[i] = delegate { Console.WriteLine("{0} {1}",++x,++y); };
}
return result;
}
static void Main() {
foreach(D d in F()) d();
}
}
出力結果:
1 1
2 1
3 1
まぁ、元の主張はともかく、y の値がこうなるのが意外だった。っていうか、C# の文法ってこんな感じなんだ。
prs = []
x = 0
3.times{|y|
y = 0
prs << lambda{puts "#{x+=1} #{y+=1}"}
}
prs.each{|e|
e.call
}
#=>
1 1
2 1
3 1
と言われると確かにそうだなぁ、と思うのだけれど。
C っぽい文法でクロージャに見慣れてないってことかな。
arton 効果で凄い人数。
ありゃりゃ、ProtoObject が 6 票で最大だったのに、BasicObject (1票) が勝ってしまった。
個人的にも ProtoObject がいいなぁとは思ってたんだけれど。
家庭用メガスターいいなぁ。欲しい。
春っぽくしてみた。
停滞っていうか、なんか考えれば考えるほど駄目になっていく。
lock-free, wait-free アルゴリズムは、ロックを用いずに何かを操作する手法。さまざまなデータ構造について、これらの方式が研究されている。
で、この二つの違いが未だにわからん。
参考: いろいろ。Some Notes on Lock-Free and Wait-Free Algorithms とか。IBM dW : Java technology : Javaの理論と実践: アトミックで行く - Japan とか。
Lock-freeアルゴリズムとwait-freeアルゴリズム 他のスレッドに任意の遅れが生じても(あるいは失敗が起きても)、どのスレッドも継続して進行する場合には、そのアルゴリズムはwait-free と言われます。対照的にlock-free アルゴリズムでは、一部 のスレッドのみが継続して進行すればよいのです。(別の仕方で定義すると、wait-freeでは他のスレッドのアクションやタイミング、インターリーブ、またはスピードによらず、各スレッドはそのスレッドのステップとして指定された数の演算操作を正しく行うことが保証されている、ということです。この指定数は、システム中にあるスレッド数の関数になっている場合があります。例えば10のスレッドがそれぞれCasCounter.increment()操作を一度行うと、最悪の場合、各スレッドは増加操作を完了するまでに最大9回のリトライを行う必要があることになります。)
違い、わからん orz
CAS による fetch-and-add は lock-free だけれど、wait-free ではない。はて。
wait-free というのは、計算量がばしっと決まっているってこと?
http://c2.com/cgi/wiki?WaitFreeSynchronization
A wait-free implementation of a concurrent data object is one that guarantees that any process can complete any operation in a finite number of steps of finite time, regardless of the execution speeds of the other processes.
lock-free はわかるんだけどな。wait-free がわからない。原著論文を読もう。
CAS による fetch-and-add は、競合を起こすと無限の時間がかかる可能性があるから、wait-free といえない、ということだろうか。
たとえば、ハードウェアによってqueue かなんかでロックの機構が実装されていていれば、それは wait-free になるんだろうか。
で、Wait-Free Synchronization (1993) を読んでみたら、証明する話なのね...。サパーリ。
レンマってメンマの親戚ですか。
うー、頭痛い。
毎度ありがとうございます。納得しました。
むしろサンマの親戚。
停滞中。
先日、OSC2005 のために作った(http://www.namikilab.tuat.ac.jp/~sasada/diary/200503.html#d21)写真を動画っぽく見るためのスクリプト。
まとめるのは面倒なので、貼っておく。
写真をアップロードするスクリプト。
UploadURL = 'どっか'
##########################
require 'net/http'
require 'uri'
Net::HTTP.version_1_2
def upload uri, file
uri = URI.parse(uri)
if block_given?
boundary = yield
else
boundary = '--------------------------' +
Time.now.to_i.to_s(36) + '--' + rand(10000).to_s(36)
end
Net::HTTP.start(uri.host){|http|
header = {
'content-type' => "multipart/form-data; boundary=#{boundary}"
}
data = []
data << '--' + boundary
data << "content-disposition: form-data; name=\"upload_file\"; filename=\"#{file}\""
data << 'content-type: application/octet-stream'
data << ''
data << open(file, 'rb'){|f| f.read}
data << "--#{boundary}--"
data << ''
data = data.join("\r\n")
res = http.post(uri.path, data, header)
res.body
}
end
while true
begin
Dir.glob("*.jpg"){|file|
puts upload(UploadURL, file)
p file
File.unlink(file)
}
rescue Exception => e
p e
p e.backtrace
end
sleep 0.5
end
ファイルを受信する奴とかファイル名を送信するサーバとか。
#!/usr/bin/env ruby18
require 'cgi'
require 'erb'
class ThroughFlow < Exception
end
MAX_FILES = 10
class Mgr
def initialize
@cgi = CGI.new
dmy, @mode, @arg, *@args = (@cgi.path_info || '').split('/')
@mode ||= 'view'
end
def start
@cgi.out{
dispatch.to_s
}
end
def dispatch
# [@mode, @arg, @args].inspect
if self.respond_to? @mode
self.__send__ @mode
else
raise "Unkown mode: #{@mode}"
end
end
def view
ERB.new(File.read('view.html')).result(binding)
end
def upload
data, = @cgi.params['upload_file']
fdata = data.read
filename = 'ul/' + Time.now.to_i.to_s + '.jpg'
open(filename, 'wb'){|f|
f.write fdata
}
files = ul_files
while files.size > MAX_FILES
File.unlink(files.pop)
end
test_page "upload: #{fdata.size}", files.join(',')+''#fdata.inspect
end
def check
files = ul_files
file = files[0]
begin
children = files.map{|child|
"<file filename='#{child}' date='#{File.mtime(child).to_s}' />"
}.join
rescue Exception => e
children = ''
end
@cgi.out('content-type' => 'text/xml',
'Pragma' => 'no-cache',
'Cache-Control' => 'no-cache'){
<<EOS
<?xml version="1.0" encoding="Shift_JIS"?>
<check id='check' filename='#{files[0]}' date='#{File.mtime(file).to_s}'>
#{children}
</check>
EOS
}
raise ThroughFlow
end
def ul_files
Dir.glob('ul/*.jpg').sort{|a, b| b <=> a}
end
def test_page title, content
<<-EOS
<html>
<title> #{CGI.escapeHTML title} </title>
<body>
<pre>#{CGI.escapeHTML content}</pre>
</body>
</html>
EOS
end
end
begin
Mgr.new.start
rescue ThroughFlow
rescue Object => e
CGI.new.out{
<<-EOS
<html>
<title> Error </title>
<body> <h1> Error: #{CGI.escapeHTML(e.inspect)} </h1>
<p> #{CGI.escapeHTML(e.to_s)} </p>
<pre>#{CGI.escapeHTML(e.backtrace.join("\n"))}
</pre>
</body>
</html>
EOS
}
end
ブラウザにみせるためのテンプレート。
<html>
<title> View </title>
<script type='text/javascript'>
<!--
function setstate(st){
document.getElementById('text1').innerHTML = st;
}
function loadXMLFile(url){
var req = createXMLHttpRequest();
req.open("GET", url, false);
req.send(null);
if (req.status == 200){
var xmldoc = req.responseXML;
var filename = xmldoc.documentElement.getAttribute('filename');
var date = xmldoc.documentElement.getAttribute('date');
loaded(filename, date);
}
else{
setstate("error");
}
}
function createXMLHttpRequest() {
return this.XMLHttpRequest ?
new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
function all_properties(obj){
var names="attrs: ";
for(var i in obj)
names+=i+"\n";
return(names);
}
function check(){
loadXMLFile('./test.cgi/check');
}
var counter = 0;
function loaded(filename, date){
document.image1.src = filename;
setstate((counter ++) + ": " +
filename + " (" + date + ")");
}
function setCheckTimer(obj){
var interval = Number(obj.value);
if(!interval || interval < 1){
interval = 1;
}
obj.value = interval;
window.clearInterval(timerID);
timerID = window.setInterval("check();", interval * 1000);
}
function setImgSize(obj){
if(obj.checked){
document.image1.width = 640;
}
else{
document.image1.width = 320;
}
}
// -->
</script>
<body
onload = 'timerID = setInterval("check();", 2000);'
onunLoad = 'clearInterval(timerID);'>
<p>
<img src='start.jpg' name='image1' boarder='1'/>
</p>
<div id='text1'> start </div>
<input type='button' onClick='check();' value='reload image' />
<div>
check interval (sec):
<input type='text' name='checktimerinterval'
onChange='setCheckTimer(this);' value='2' />
<input type='button' value='reflect' />
<br>
double size?
<input type='checkbox' name='doublesize'
onChange='setImgSize(this);' />
</div>
<div id='children'></div>
</body>
</html>
こいつらで、簡易動画配信ができる。帯域は食いまくるわけですが。
JavaScript の使えるブラウザさえあれば、動画っぽいものが見ることができる。
今回の投票は他の方からネタを貰いました。
積年のバグがなおった。
\" を escapeHTML すると \"e; になって、そいつを gsub 第二引数にしてアボーン。
うう、29件か。激戦だ。
鼠と竜のゲームを読んでるんですが、なんか終わり方がよくわからない。
shiro さんが出るとかいうドラマ、みそこねた orz
CAS (compare-and-swap) と LL/SC (load-linked/store-conditional) 、どっちが実装しやすい、ハードウェア的に有利なんだろう。
論文を探してるんだけど見つからない。
lock-free algorithm でいう LL/SC 命令は、プロセッサに載ってる LL/SC 命令よりも強い命令だったのだなぁ。知らなかった。(後者を restrected-LL/SC -> RLL/RSC と称しているらしい)。
rll/rsc 命令は (i) ll/sc が成功していても失敗するかもしんない(プロセッサの都合) (ii) ll/sc 命令の間に(共有)メモリアクセス禁止 という制限がある。
プロセッサのつくりを簡単にするためには、まぁ、そうだなとは思うけれど。
RLL/RSC 命令にはレベルがあるのか。
前者は ll addr を持たないため、どんなキャッシュ一貫性制御が働いても rsc は失敗する。後者はその ll addr へのなんらかの一貫性制御が働いたら rsc は失敗する。
その辺を記述した論文が見つからん・・・。
CAS の実装ってどうなってるのかなぁ。load と store を一緒にしないといけない(かもしれない)から、複雑になるような気がするんだけど。Sparc や Itanium は CAS 使ってるらしいし。
ll addr は、なんか微妙に考えてるのと違うかも。。。
どうにも、探しても compare-and-swap と ll/sc は同等の記述力(意味)を持つ、くらいしか書いてない。ハードウェアに実装する視点からこれら二つを比べたものは無いものか。
compare-and-swap って、どうやって load/store 間の一貫性を保証してるんだろうか。データバスをロックしてしまう?
sparc のアーキテクチャマニュアルに載っている fetch-and-add の例。
FetchAndAddCAS(address => %i0, increment => %i1) retry: ld [%i0], %l0 #=> %l0 = *%i0 add l0, %i1, %l1 #=> l1 = l0 + %i1 cas [%i0], %l0, %l1 cmp %l0, %l1 bne retry
ll/sc でやってみる。MIPS。
FetchAndAddLLSC(address => t1, increment => t2) retry: ll t3, (t1) add t4, t3, t2 sc t4, (t1) beqz t4, retry
うーん。ll/sc のほうがいろいろと有利な気がするんだけどなぁ。
Acquire 命令は、load/store を 1 命令で行うんだが、それは CAS でも同様。ならば、CAS を行う回路で、compare and sleep に変更するだけで実装可能なんだろうか。なんか、CAS が十分軽量に出来るのであれば、それはそれで非常にリーズナブルな気がしてきた。
うーん。どうしよう。
「Acquire は load/store を 1 命令で行うため、ll2/sc2 はいいものだ!」という主張が崩れる。どうしよう。
まぁ、命令の使いやすさは ll2/sc2 のほうがいいから、別に優位性は変わらないのだが。論文の書き方が変わってしまう。
どうしよう。
うーん。MIPS (か PowerPC)と Sparc (とか Intel 系)を同時に作ってる人に聞けば、そのよしあしがわかるね! って、そんな人いるのか。
キャッシュのコヒーレント制御プロトコルや、バスの設計にも依存する話だしな。どうしたもんだか。困った。
探しても探しても、CAS やら ll/sc を利用したアルゴリズムの話ばかり出てくる。
下位互換のために CAS にしてるのかなぁ。でも、Itanium の説明になってないな。
LL/SC から CAS はできるけど、CAS から LL/SC はできない。CAS が十分コストが少なければ問題ないんだけれど。はて。
IBM dW : Java technology : Javaの理論と実践: アトミックで行く - Japan
CASのような命令を使うと、もし他のスレッドが変数を変更するとCASがそれを検出(または失敗)し、アルゴリズムがその操作を繰り返すことができるので、他のスレッドが途中で変数を変更してしまう、という心配をせずにread-modify-writeシーケンスを実行するアルゴリズムが可能になります。リスト3はCAS操作の振る舞いを示しています(パフォーマンス特性は示していません)。しかしCASの真価は、ハードウェアで実装でき、しかも(大部分のプロセッサーでは)非常に軽量だということです。
非常に軽量なのかぁ・・・。
ll/sc の初出が A New Approach to Exclusive Data Access in Shared Memory Multiprocessors らしい。
きちんと「CAS などよりも latency とかの問題で優れてるし、RISC っぽくパイプラインシンプルになるぜ」って書いてある。
しかし、87年の論文の記述。さて、これを信用することができるのか。
cas の実装方法がどっかに載っていないものか。
cas で実装しか見つからない。
The dragon processor (ACM SIGARCH Volume 15 , Issue 5 (October 1987)) より。
CST: Conditonal Store
The implementation of CST is primarily in the cache; the IFU presents the cache with the ptr, old, and new words, issues a CST command, and receives the sample result word. Synchronization with other processors is not necessary unless the addressed cache line is shared and old equals sample.
キャッシュで追い出し禁止にしておけば済むから、バスは押さえなくてもいいってことか。
しかし、古い。
あとは、ll/sc と cas との比較が見つかればいいんだけれど(A New Approach to Exclusive Data Access in Shared Memory Multiprocessorsには載っているが、できれば最新の技術の元での比較)。
まだまだ Rubyist Magazine が Ruby Magazine だと思われている。まぁ、しょうがないか。
愛が冷めたのか知らん。
うーむ。CAS が十分速いプロセッサなら、SMT-block が簡単に適用できるような気がしてきたな。要するに、Acquire 命令にエラー処理加えるだけだから。そうなると、提案手法の意義が・・・。
まずいなー。
ロック獲得予約を前面に出せば、大丈夫だろうか。
QOLB ってなんだー。
コルビー
あー、今日はたくさん論文刷った。
むぅ、セーターの下が気になる。
Ruby と Smalltalk ってそんなに離れてないんだろうか。いろいろと大変そうだなぁというところは思いつくけど。別に否定はしませんが。楽しみではあります。
なんかえらそうだな、俺。
きっと俺より凄いので是非勉強させてください。
最近停滞中。
寒すぎ。
情報処理関連の学会などの広報は SWoPP ML がそれを代用している。しかし、ソフトウェア開発とか、その辺のイベントの広報を集約する場所は、たしかにないなぁ。と、mixi を見て。作るのは簡単だけれど。
うわー。IPAX と SACSIS の日程、まんま被ってるやんけー! しまったなぁ・・・。SACSIS を蹴るしかないのだけれど。うーん、いろいろと SACSIS で聞くことがあったのに。
うーん、どうしよう。しくしく。SACSIS の懇親会にも出たかったのだけれど、きっと被りそうだよな。あきらめるしかないか。
うおー。SIGPLAN いきてー。
First ACM/USENIX Conference on Virtual Execution Environments (VEE'05) 聞きてー。
ありゃぁ。電話してくれればよかったのに。
課題図書。YARV には全然関係ないけどさ。
4/16(土)の RHG 読書会は、arton さんをお招きして根掘り葉掘り聞き出そう会を予定しているので、暇な人も暇じゃない人も是非。
詳細は RHG読書会 ML にご参加して確認してみてください。
花見は楽しかったです。しかし原宿渋谷、人多いな。
今日は YARV の記事を書いてしまおう。
http://www.sakura.ne.jp/rs/03_05.shtml
随分安いんだなあ。
ふと、プルタップのことを思い出して、昔は外れたんだよなぁ、とか思って、最近の奴は、と思い出そうとしたら、そういえばペットボトルのものしか買わないなぁ、と思った。
録音テープを聞きながらオペレーターが発話する方法が効率的
目からうろこ。
英会話の学習法として、音声認識ソフトが認識してくれる英語が発音できるまで練習する、というのはどうだろう。
ククク、なんか想像どおりの行動が観察できた。やっぱそうなんだなぁ。
お花見でご一緒させていただいた者です。一つ質問を忘れていました。YARVってなんて読むんでしょう?
音声認識技術を用いて発音を採点するってところまで既に行ってますよ。http://www.phonepassjapan.com/
好きなように読んでもらって結構です。>YARV
土曜日曜とテープ起こししてました。しんどいですよね。時間がかかるってのもあるけど、集中を続けるのがしんどい。
えーーと・・・。
産総研にいってインタビューしてきました。
12:00 に家を出ました。
12:40 に家に帰りました。
(ほぼ)インタビューしかしてません。
アリエネー。
International Obfuscated Ruby Code Contest (IORCC) で、投票をやっているらしいです。
そういえば、高橋課題図書「星を継ぐもの」読了。ミネルヴァがどこから出てきたのかわからんかった。
なんかやらなきゃいけないような気がしたのでアンケートを更新(78: Ruby: Object の 上の Kernel をインクルードしない「なにか」の名前)。長すぎ。
通学で利用する桜並木が満開に。大変綺麗。事故らないようにしないと。
やっぱ指切られるのかー。
1999年から見て 2005年(現在)について想像できなかったことを考えてみる。やっぱり博士後期課程なんかに進むのは想像できなかったなぁ。
情報処理学会の研究会に、学生は一個無料で入れるんだけれど、何に入ろうかなぁ。PRO は先生が入っているので、論文誌は届くから要らないし。ARC も OS も同様。
多分、すげーマイナーで面白そうなのがいいと思うんだが。どうしようかな。
漏れが入っていても、「あぁ、彼もとっていたのか」があるから、好きなの、選んだ方がいいぞよ
スタッフロールつきの夢を見た。
高橋さんの宿題シリーズ、地球幼年期の終り読了。上主は overload なんだなぁ。しかし、1953年にこんなもん書いてるってのは凄い。
某何のカカレンはこいつのパロだったのか。
そういえば、D2 なんだなぁ。
URL が変わったので一応。
require 'cgi'
require 'net/http'
data = ''
while line = ARGF.gets
data << line
break if /\x00/ =~ line
end
body = CGI.escape(data)
Net::HTTP.version_1_2
Net::HTTP.start('www.atdot.net', 80) {|http|
response = http.post('/sp.cgi/commit/auto',
'paste_body=' + body)
puts response.body
}
最近、なんだか考えすぎて行動が全然起こせていない。
考えすぎて、論文を書いていない。アレもやらないとあかん、これが全然足りない、それの評価が全然駄目。
考えすぎて、プログラムを書いていない。設計が〜。アルゴリズムが〜。
どうにも、いけないことになっている気がする。
shred 初体験。そして、そんなときに限って必要なデータが。そうならないことを祈ろう。
さて、遊んでないで本腰入れないと。論文書くぞー。
CooS。未踏の CLI を基本とする OS。
うーん、OS のアーキテクチャが一切書いてないので、イメージがよくわからないなぁ。ソース見るのは面倒だし。
langsmith ML、変な spam がたくさんきてるんだなぁ。Matz にっき効果恐るべし。
favicon なぞを付けてみる。
wanderlust を使ってみる。
imap フォルダ名に @ が入っていると、そのフォルダが見れないっぽい。どうしたものか。サーバ名と勘違いしてるんだろうなぁ。
イベントなどに行くと、名刺を頂く機会が多いんだけれど、名刺と顔がさっぱり結びつかない。デジカメに名刺リーダーつけて管理、なんてどうだろう。名刺リーダー付き携帯・・・は重そう。
と思ったら、ITmediaモバイル:Samsung、7メガピクセル携帯を開発
Samsungの「SCH-V770」は7メガピクセルのカメラを搭載、マニュアルフォーカスなどカメラ付き携帯には珍しい機能や、MP3再生機能、名刺リーダも備える。(IDG)
欲しいかも。でもでかそうだなぁ。他の機能要らんし。
うーん、花見どうしよ。
正直なところ、「ルビま!」休刊、と書いて「Rubyist Magazine」休刊と読む人がこんなに居るとは思わなかった。世間様では「るびま」も「ルビま!」も同じようにパースされるんだろうか。
星界の戦旗 IV 読了。図書館でばったり会えた。
しかし、笑ってくれる人がいるっていうのは、ほっとするね。大変、ありがたいです。
グインサーガ 93, 94 読了。よく続くよな。しかし、93 はともかく 94 はテンポがよくてよかった。半分くらいが反復だったんじゃないかと。でも、それを読ませる筆力はさすがだなぁ。
俺的 4/1 の一番は You Know Sasada-san? (略)だった。ちとフライング気味だったけれど。あぁ、あと選挙ポスター。あれもフライングだったな。
ちなみに、私は尊師の靴持ちらしい。あれ、かばん持ちだったっけ。
で、マジで騙されたのは母親に「円形脱毛症が出来てる」といわれたこと。古典的だとは思ったけれど、最近大変だったから。いや、まだ大変か。
う、首藤さんにひかれてしまったらしい(http://www.shudo.net/diary/2005apr.html#20050401)。
ガーン。Zope.org - Zope3勉強会第一回のお知らせ。4/9 らしい。行きたかった。python の勉強に。
投票、更新しました。
懸念だったサーバの交換をやっとやる。
sp.cgi の場所が変わりました。
http://www.atdot.net/sp/ でどうぞ。
これで、一応移行完了か。一週間くらい様子を見よう。
…ひかれちゃったのは私の責任大ではないかと
内容は僕にとってもとても楽しいです。 でも、アニメ好きぶり(→内輪ノリ)を前面に出すのは、RubyファンとかRuby自体にとってプラスにならないんじゃないかと。 って、ヒいちゃうような(内輪以外の)人は見に来ないか。
アニメファンといっても、たいていの人は限られた(自分が学生だったころの)年代の作品にしか興味ないので…「ネギま!」とか知ってる人は数%くらいしかいないと思われます。
ちなみに、私はネギま!もプリキュアもよう知りません。
「知ってる人は数%くらいしかいない」のは「名前さえ」ね。
ネギま!もプリキュアもRHG読書会で知りました。
やるな、RHG読書会。関西も負けてられないな。何で対抗しようかな?w
ちなみに「ネギま!」は知りません。プリキュアは娘がいるのでちょこっと。「ルビま!」書いてた人らもほとんど知らないんじゃないかな?
今年度の目標です。
両プログラミング言語は、覚えやすい、使いやすいと評判で多くのユーザが居ますが、処理系としての完成度から見ると少々疑問が残ります。そこで、(多分それなりに頑張った)YARV で動作させれば、処理速度の問題は解決されます。
実は、昨日の未踏ソフトウェア創造事業への申請は「日本発のプログラミング言語を世界に」というテーマで応募してみました。内容は上記を実現するようなものです。
通るといいんですが。
まずは HSP となでしこの仕様を調べるところからはじめないとなぁ。
Rubyを使って巨大整数のフェルマーテストを実行しているんですが、仮想記憶を30ギガ用意してもメモリゲットに失敗します。Rubyでメモリ制限があるのでしょうか?あるいはハード的(BIOS?)に認識できないんでしょうか。因みにシステムはLinuxカーネル2.4です。
仮想メモリ空間の制限がたぶん2GB なので、1プロセスが30GBのメモリ領域を確保するのは無理なんじゃないでしょうか。
Opteron等64ビットプロセッサで64ビット向けにコンパイルされればプロセスのメモリ空間も広がります。16GB位は使ったことあります。