大晦日なので,プロセッサを作ってみたい夢を語ってみる.
で,スタックマシン再びってのはどうなんだろうなぁ,とずっと考えてる.
深く考えると,「テキスト領域なんてメモリ全然くわねーよ」とか,「結局,MIPS みたいなのになるから複雑度はかわらねーよ」とか言われそうだけど,無視.
他との通信はキューなのかなー.Actor っぽいモデルになっちゃうのかなー.もうちょっとスタックマシンらしい,おかしな設計は無いものか.
考えてると,バルク的な使い方をするふつーのローカルメモリと,スタックで使うローカルメモリがあって,とかいう,まったくふつーのプロセッサになってしまうので面白くない.
他のプロセッサのスタックに push する命令があって,データフローになってて,必要なスタックサイズが積まれたら発火するようになってたり.そんな感じでパイプライン処理.
って,動いてる時には積めないから面白くないな.
fork 命令があったりするのかな.手続きに必要なスタック数積んで fork.あいてるプロセッサに text とスタックのデータ持って行って dispatch.もしあいてなかったら自分でやっちゃう,みたいな.
その返値どうやって取るねんな.
特殊な primitive でなんとかするのかな.帰ってくるのを待つような.
で,細粒度スレッド言語のようになりそう.
とかなんとか,古い文献探したらありそうではある.
細粒度スレッドプログラミングに特化したプロセッサ.
thread dispatch のたびに text を送るのも酷い話だな.関数の ID くらいなのかな. しかし,あいている人を探すとか,結果を待つとか,そういうのはスケールしなさそうだなぁ.
とりあえず,fib を実装してみよう.
def fib n if n < 2 1 else fib(n-1) + fib(n-2) end
が,JVM 風だと,
fib: load n sub 2 ifge recurse 1 goto return recurse: load n sub 1 call fib, 1 load n sub 2 call fib, 1 add return: return
こんな感じだろうか.もう JVM のコードなんて,10年くらい見てないからわかんねー(考えてみると恐ろしい).つか,call なんて無いわな.
さて,これに fork を入れてみる.
def fib_big n if n < 20 fib n else async{ fib_big(n-1) } + async{ fib_big(n-2) } end end
なんというか,よくわからない言語になっちゃってるけど,とりあえず.
fib_big: load n sub 20 ifge spawn load n call fib, 1 goto return spawn: load n sub 1 spawn fib_big load n sub 2 spawn fib_big wait wait add return: return end
こんな感じになるんだろうか.うーん.ありきたりだな.スケールしなさそうだし.
text は共有じゃないとやってらんねーかなぁ.それはそれでつまらなそうなんだが.
というか,スタックマシンにした意味がさっぱり無いな.デコーダー作るのが楽,とかだろうか.
うーん,普通すぎて面白くない.いや,結局ネックはそこじゃない,って話で....
実際,スタックマシンとレジスタマシンでハードウェア量ってどれくらい変わるものなのかな.
http://www.transputer.net/iset/
おお,たくさん書いてある.
こんなときに,まさかのマシントラブル.D論からお世話になった 8 core xeon マシン(4 core xeon x 2).ビープ音からすると電源まわりのようなのだが,電源を変えてみても変わらない.多分,マザーボードではないかと思う.
ずっとお世話になってきたので悲しい.
というか,ここに入っているデータでなんかしようと思ってたのに! ということで,焦っている.
とりあえずデータのサルベージだけでも,と思ってやってるんだけど,fsck をスキップできなくて困る.西山さんに tune2fs を教えてもらって,解決.
が,違うマシンが NIC どうのでつながらない.しょうがないので USB メモリで救出.
うう,最後までついていない.
他の人と同様,いつもそれなりの自殺願望はあるわけだけど,2010年ほど死にたい死にたいと思いながら生活していた年はなかったような気がする.
来年はいい年になるといいなぁ.
http://hiroki.jp/2010/12/29/1168/
Ruby を使えば自分の年齢を自動更新して表示できます。
<%=% (Time.now.strftime("%Y%m%d").to_i - 19900605) / 10000 %>歳
一瞬,何をやってるかわからなくて,悩んでしまった.富豪っぷりに感動した.
教員の人数分布.平均年齢とか.これ,学部ごとに見てみたいなぁ.大分違うよな.教員平均は 978 万円.全若者特任時代の前後でどれくらい変わったか見てみたい.講師平均額が 848 万円か.遠く及ばない.
しかし,平均年齢が凄いことになってるなあ.東大の一番若い教授は38歳なのか.
なんで,12月は家で布団敷いて眠れなかったのだろう. 普段,ダラダラしていたツケなんだろうか.
年末年始は全力で寝たい.
声明によると、売却はすべて市場価格で実施された。売却規模は、IMFの金準備の8分の1に相当する。
金準備が3200トンあったってことだよな.ルパン三世の世界だ.金庫室何個分なんだろ.
長さ25メートル、幅10メートルのプールに3200トンの金を流し込んだら64センチくらいか。意外と少ない。
今週はイベント盛りだくさん過ぎて死ねる.クリスマスが一切絡まないのが泣ける.
国立大学などの公的研究機関で働く研究者は全体では増えているものの、若手に限れば減少していることが、内閣府の調査でわかった
なんというか.
盛りだくさんななかに,凄いイベントが割り込んできた.
俺,なんか悪いことしたかなぁ.
http://www.atdot.net/fp/view/jtaddl
スカイツリー. 日曜日に iPhone で撮ったんだけど,なかなか良い写真ではないでしょうか.
インターフェースの街頭なんて本はどうだろうな.
http://practical-scheme.net/gauche/index-j.html
また、あるスレッドで捕捉された継続や部分継続を 別のスレッドで起動することができるようになりました
えー.どうやってんだろ.
http://blog.practical-scheme.net/gauche/20101116-partial-continuations に詳しく書いてあるんだろうけど,日本語でおkな感じだ.後で読もう.というか,英語のブログ知らなかった.
色々と追い詰められてきた.自業自得.
いや、VMのスタックフレーム自体はもともとどこにでも移動可能で、単に引っかかってたのは継続起動時のチェック部分だけだったので。Cスタックが含まれている継続はそこに戻る時点でエラーになります。部分継続はCスタックを含まないようになってます。
録画した番組を 2 倍速で見ることが多いんだけど,2倍速で聞きやすい声と聞きづらい声がはっきりわかれていることがわかってきた.アナウンサーの人の声は,やっぱり聞きやすい,とか.
自省するために,2倍速で自分の講義,発表を聞くといいんだろうか.
図書館で続き物の本を借りると,どこまで借りたのか思い出せなくなってしまう.メモとっておけばいい話ではあるのだけれど.
自宅で音楽を聴くこともあるのだけど,3000円で買ったスピーカーしかないので,それなりにしょぼい(でも,そんなに悪くないと思っている.KENWOOD の OPM-A3.学生時代は粗大ゴミ置き場に置いてあったアンプとかを使っていた).
この程度でそれなりに満足している耳だけど,もうちょっとグレードアップしても良いかな,と思っているのだけど,なんかオススメありませんかね.
音に拘り出すと魔道に落ちるような気がするので,あんまり深入りはしたくないのだが.いや,そもそもそんな良い耳は持ち合わせていないので,心配ないかな.映像とかも,しょぼくても平気なので,全体的にセンサーの感度が悪いんでしょうね.
いやー,さすがにクラシックとか厳しいな.
サーバの置いてある場所のネットワークがダウンしているのでメールが見れません.すみません.
復旧しました.
節約のために iPhone 3G のデータ通信を切ってたんだけど.
通信料 PCダイレクト@0.08円 53062Pkt 4,244円
一度,マクドナルドのクーポンのページを見るために,3G データ通信をオンにしただけでこれだけ使っていた.なんというか,大敗北.
なんでこんなに通信してるの.
マクドナルドのクーポンならガラケーの専用アプリほうが良いですよ。専用アプリは画像データのやりとりがないので、ほとんどパケット通信しませんので‥‥。
Ruby VM 開発者として,VM なんとかっていうカンファレンスに呼ばれてるんだけど,年度末なので,もう予算が無いような気がするんだよな.
泣いてしまった.あれはきつい. 自分だったらと思うと.
Disabling Ruby 1.9.x's YARV compiler
1.8 よりも 1.9 のほうが,起動が 5 秒から 23 秒に遅くなっちゃったんで,YARV 捨てられる? って質問.
こんなに起動に時間のかかるアプリをお持ちでお困りの方で,私にソースコードを送っても良い,という人がいましたらご連絡頂けると助かります.
なんというか,ここまでヤバイのは初めてだ.どうしよう.
実は文字列処理が多いんじゃないか疑惑
Ruby 1.9 において,n バイトで収まる文字数,もしくは n バイト目が文字境界の場合は,その後ろまで取ってきてくれる方法を,中田さんに教えてもらう.
gets(nil, n) らしい.gets(nil) なんて発想ねーよ!
雨の中びしゃびしゃになりながら,着いたら快晴.
わたしの居る専攻では,冬入試を行います.まだ,大学院に行ってもいいかなぁ,とか,笹田のところで研究したいなぁ,という人が居れば,検討頂けると良いかと思います.
「元気な日本復活特別枠」の結果は http://seisakucontest.kantei.go.jp/article/about の資料で見れるのね。
政府情報システム刷新のためのクラウド基盤の整備事業
こういうのが A なんだなぁ。1.8 億って,どんなことするんだろ。
文部科学省の要望については、要求で一旦、形式的に廃止した扱いにした上で、増額要望していること、また、その結果、金額的にも全府省要望総額の3割を占める要望となっていることから、「特別枠」の趣旨に照らして問題が大きい。したがって、文部科学省については、全般的に大幅な要望の圧縮と、要求の削減による新たな財源捻出が必要
ふーむ。どこを目指したいんだろうなあ。
小学校1・2年生における35人学級の実現
こども手当よりも、こういう教育機会の拡充に金をかけた方がいいんでないかと思うんだけど。待機児童問題とかも含めて。
小学校は全部30人学級、担任・副担任(x 2名)を付けます、とか、どうだろう。雇用の促進にもなるだろうし。副担任は若い人、第二の人生を送ってる方とかに、ボランティアに近い形で協力してもらうとか。少子化を活かして、その代わり教育の質を上げていくとか。いや、そんな先生がいたらうざい、という意見もあるかもしれない。そういえば給食費の話もありましたね。この辺も、全部無償化で。
「強い人材」育成のための大学の機能強化イニシアティブ
自分に直接かかりそうなのはこれなんだろう。1200億円。凄い額だね。有効に回ればいいと思います。
元気な日本復活!2大イノベーション
計算機とライフ分野に 800 億円。額は大きいけど、世界一を取るには厳しいのではないか?
ムリョウ的には、「宇宙人は、実は居ました」って感じだよな。
続編やらないかな。
EINTR のチェックをちゃんとやってるかどうかをチェックする方法は無いかなぁ、と思って、ptrace を使ってやってみた。failmalloc のように、とにかくシステムコールがガンガン EINTR を返す。
# # fakeeintr.rb # require 'optparse' require 'ptrace' opt = OptionParser.new{|o| o.on('-p', '--pid PID'){|pid| $pid = pid.to_i } o.on('--unistd UNISTD_FILE_PATH'){|us| # for exmaple: '/usr/include/asm-i486/unistd.h' $uni_std_file_path = us } o.on('-v', '--verbose'){ $verbose = true } } opt.parse!(ARGV) if defined?($uni_std_file_path) # read syscall number information class PTrace SYSCALL = Hash.new File.read($uni_std_file_path).each_line{|line| /\#define __NR_(\S+)\s+(\d+)/ =~ line SYSCALL[$2.to_i] = $1 } end end if defined? PTrace::SYSCALL def syscall_name eax PTrace::SYSCALL[eax] end else def syscall_name eax eax.to_s end end $n = 0 $intr_signal = :SIGALRM def fake_eintr? name if $n < 100 $n += 1 true else $n = 0 false end end def exec_trap ptrace regs = ptrace.getregs name = syscall_name regs.orig_eax puts "#{$is_call ? 'call:' : 'rtrn:'} #{name}" if $verbose $is_call = !$is_call if fake_eintr? name if $is_call # returning timing ptrace.syscall else ptrace.syscall $intr_signal end else ptrace.syscall # continue end end def trace_syscall ptrace $is_call = true ptrace.wait ptrace.syscall while e = ptrace.wait case e when :SIGTRAP exec_trap ptrace else if e == $intr_signal ptrace.syscall else ptrace.syscall e end end end end if defined?($pid) ptrace = PTrace.attach($pid) elsif ARGV.empty? puts opt.help exit else ptrace = PTrace.exec(ARGV.join(' ')) end puts "PID: #{ptrace.pid}" if $verbose trace_syscall(ptrace)
シグナルの使い方が絶妙というか微妙。
なかなか良いものが出来た。
この小さなプログラム:
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello\n"); return 0; }
を、普通に動かすと、
PID: 13910 call: brk rtrn: brk call: access rtrn: access call: mmap2 rtrn: mmap2 call: access rtrn: access call: open rtrn: open call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: close rtrn: close call: access rtrn: access call: open rtrn: open call: read rtrn: read call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: mmap2 rtrn: mmap2 call: mmap2 rtrn: mmap2 call: close rtrn: close call: mmap2 rtrn: mmap2 call: set_thread_area rtrn: set_thread_area call: mprotect rtrn: mprotect call: munmap rtrn: munmap call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: write hello rtrn: write call: exit_group
こうなる(システムコールから入ったとき、出てきたとき)。
fakeeintr を使うと、
PID: 13918 call: brk rtrn: brk call: access rtrn: access call: mmap2 rtrn: mmap2 call: access rtrn: access call: open rtrn: open call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: close rtrn: close call: access rtrn: access call: open rtrn: open call: read rtrn: read call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: mmap2 rtrn: mmap2 call: mmap2 rtrn: mmap2 call: close rtrn: close call: mmap2 rtrn: mmap2 call: set_thread_area rtrn: set_thread_area call: mprotect rtrn: mprotect call: munmap rtrn: munmap call: fstat64 rtrn: fstat64 call: mmap2 rtrn: mmap2 call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write rtrn: write call: write hello rtrn: write call: exit_group
こうなる。printf は、ちゃんと EINTR 対策をしていることがわかる(成功するまで繰り返している)。
しかし、誰得なプログラムではある。いや、自分で使うために作ったのではあるが。
しかし、意外とちゃんと動くものだな。
ruby-ptrace は、結構面白いと思うんだけど、知名度がない。今度、授業でこれ使うかなあ。
Transputerが近いのではないでしょうか?
不勉強で詳細を知らないのですが(本は学生の頃買ったんだけど),思想自体はそんな感じだと思います.
ネットワークの利用というか,Occam のコンパイル結果がどうなるのか,よくわからんですねぇ.http://en.wikipedia.org/wiki/Transputer を見ても.
transputer懐かし。研究室にありました。あんまり触らなかったけど。ネットワークについては専用ハードがあるので、CPUからは単にsend, receiveの指示を出してただけのような。同期もメッセージのやりとりで。今のCPUアーキテクチャから見るとシンプルな作りだとおもいます。