K.Sasada's Home Page

Diary - 2010 December

研究日記

師走

_31(Fri)

大晦日なので,プロセッサを作ってみたい夢を語ってみる.

  • メニーコア向け(100以上)
    • 出来るだけ簡単・小さい
    • できるだけテキスト(バイナリ)も小さい方がいい
    • 同期の仕組みとかどうするかな
    • GPGPU とか,どうなってるのかな? よくしらない
  • メモリ階層を意識させる設計
    • ローカルメモリをもつ
    • 外部メモリとの通信はどうしようかな
  • 割り込みとかどうしよう
    • コンテキストの保存,復帰とか
    • 保護とかどうするかな

で,スタックマシン再びってのはどうなんだろうなぁ,とずっと考えてる.

  • プロセッサはえらい簡単になる
  • テキスト領域は小さい
  • 「スタック」というローカルメモリがある.自然!
    • コンパイラは,出来るだけローカルメモリ内に納めるようにがんばる
  • やっぱり,外部メモリとのインターフェースはよくわからん
  • 他のプロセッサとの同期とかどうすんのかね
  • スタックがあふれたらどうすんだろ 関数呼び出しのタイミングで,あふれてたらなんか頑張ると思うんだけど

深く考えると,「テキスト領域なんてメモリ全然くわねーよ」とか,「結局,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年ほど死にたい死にたいと思いながら生活していた年はなかったような気がする.

来年はいい年になるといいなぁ.

_miura1729(Fri Dec 31 06:47:10 +0900 2010)

 Transputerが近いのではないでしょうか?

_ささだ(Fri Dec 31 13:59:30 +0900 2010)

 不勉強で詳細を知らないのですが(本は学生の頃買ったんだけど),思想自体はそんな感じだと思います.

_ささだ(Fri Dec 31 14:19:46 +0900 2010)

 ネットワークの利用というか,Occam のコンパイル結果がどうなるのか,よくわからんですねぇ.http://en.wikipedia.org/wiki/Transputer を見ても.

_shiro(Fri Dec 31 15:29:35 +0900 2010)

 transputer懐かし。研究室にありました。あんまり触らなかったけど。ネットワークについては専用ハードがあるので、CPUからは単にsend, receiveの指示を出してただけのような。同期もメッセージのやりとりで。今のCPUアーキテクチャから見るとシンプルな作りだとおもいます。

_30(Thu)

http://hiroki.jp/2010/12/29/1168/

Ruby を使えば自分の年齢を自動更新して表示できます。

<%=% (Time.now.strftime("%Y%m%d").to_i - 19900605) / 10000 %>歳

一瞬,何をやってるかわからなくて,悩んでしまった.富豪っぷりに感動した.

_29(Wed)

あー,今年ももうすぐ終わるんだなあ.

_28(Tue)

よくよく考えてみると,「個人情報」と「審査情報」は同じくらいのセキュリティレベルであるような気がする.

しかし,まぁ無ければない方がいいわな.

_24(Fri)

国立大学法人 東京大学の役職員の報酬・給与等について

教員の人数分布.平均年齢とか.これ,学部ごとに見てみたいなぁ.大分違うよな.教員平均は 978 万円.全若者特任時代の前後でどれくらい変わったか見てみたい.講師平均額が 848 万円か.遠く及ばない.

しかし,平均年齢が凄いことになってるなあ.東大の一番若い教授は38歳なのか.

_23(Thu)

自殺者3万人は伊達じゃない,と思わされる.


古いところに spam がきたな.

_22(Wed)

なんで,12月は家で布団敷いて眠れなかったのだろう. 普段,ダラダラしていたツケなんだろうか.

年末年始は全力で寝たい.


IMF、403.3トンの金売却プログラムを完了

声明によると、売却はすべて市場価格で実施された。売却規模は、IMFの金準備の8分の1に相当する。

金準備が3200トンあったってことだよな.ルパン三世の世界だ.金庫室何個分なんだろ.

_nishio(Fri Dec 24 17:01:29 +0900 2010)

 長さ25メートル、幅10メートルのプールに3200トンの金を流し込んだら64センチくらいか。意外と少ない。

_20(Mon)

今週はイベント盛りだくさん過ぎて死ねる.クリスマスが一切絡まないのが泣ける.


公的研究機関の若手研究者減少…内閣府調査

国立大学などの公的研究機関で働く研究者は全体では増えているものの、若手に限れば減少していることが、内閣府の調査でわかった

なんというか.


盛りだくさんななかに,凄いイベントが割り込んできた.

俺,なんか悪いことしたかなぁ.

_17(Fri)

もう金曜日か!

_14(Tue)

http://www.atdot.net/fp/view/jtaddl

スカイツリー. 日曜日に iPhone で撮ったんだけど,なかなか良い写真ではないでしょうか.

_kt(Tue Dec 14 08:25:29 +0900 2010)

 beautiful

_NLee(Wed Dec 15 10:08:49 +0900 2010)

 真ん中の円いしみみたいなのはなんなんでしょうか?しかし奇跡みたいなタイミングですね.

_13(Mon)

インターフェースの街頭なんて本はどうだろうな.


http://practical-scheme.net/gauche/index-j.html

また、あるスレッドで捕捉された継続や部分継続を 別のスレッドで起動することができるようになりました

えー.どうやってんだろ.

http://blog.practical-scheme.net/gauche/20101116-partial-continuations に詳しく書いてあるんだろうけど,日本語でおkな感じだ.後で読もう.というか,英語のブログ知らなかった.


色々と追い詰められてきた.自業自得.

_shiro(Mon Dec 13 09:21:27 +0900 2010)

 いや、VMのスタックフレーム自体はもともとどこにでも移動可能で、単に引っかかってたのは継続起動時のチェック部分だけだったので。Cスタックが含まれている継続はそこに戻る時点でエラーになります。部分継続はCスタックを含まないようになってます。

_12(Sun)

録画した番組を 2 倍速で見ることが多いんだけど,2倍速で聞きやすい声と聞きづらい声がはっきりわかれていることがわかってきた.アナウンサーの人の声は,やっぱり聞きやすい,とか.

自省するために,2倍速で自分の講義,発表を聞くといいんだろうか.


図書館で続き物の本を借りると,どこまで借りたのか思い出せなくなってしまう.メモとっておけばいい話ではあるのだけれど.


自宅で音楽を聴くこともあるのだけど,3000円で買ったスピーカーしかないので,それなりにしょぼい(でも,そんなに悪くないと思っている.KENWOOD の OPM-A3.学生時代は粗大ゴミ置き場に置いてあったアンプとかを使っていた).

この程度でそれなりに満足している耳だけど,もうちょっとグレードアップしても良いかな,と思っているのだけど,なんかオススメありませんかね.

音に拘り出すと魔道に落ちるような気がするので,あんまり深入りはしたくないのだが.いや,そもそもそんな良い耳は持ち合わせていないので,心配ないかな.映像とかも,しょぼくても平気なので,全体的にセンサーの感度が悪いんでしょうね.

いやー,さすがにクラシックとか厳しいな.

_10(Fri)

サーバの置いてある場所のネットワークがダウンしているのでメールが見れません.すみません.


復旧しました.


節約のために iPhone 3G のデータ通信を切ってたんだけど.

通信料 PCダイレクト@0.08円 53062Pkt 4,244円

一度,マクドナルドのクーポンのページを見るために,3G データ通信をオンにしただけでこれだけ使っていた.なんというか,大敗北.

なんでこんなに通信してるの.

_gunjisatoshi(Sat Dec 11 07:52:49 +0900 2010)

 マクドナルドのクーポンならガラケーの専用アプリほうが良いですよ。専用アプリは画像データのやりとりがないので、ほとんどパケット通信しませんので‥‥。

_9(Thu)

Ruby VM 開発者として,VM なんとかっていうカンファレンスに呼ばれてるんだけど,年度末なので,もう予算が無いような気がするんだよな.


泣いてしまった.あれはきつい. 自分だったらと思うと.

_7(Tue)

JR渋谷駅ホームに「立ち食いどん兵衛」−地域限定どん兵衛も

渋谷駅で昼飯探そうと思って,探し回っても,これというものがなかったので,諦めかけていたら,この立ち食いがあったので入ってみた.この宣伝費はペイするのか?

_6(Mon)

Disabling Ruby 1.9.x's YARV compiler

1.8 よりも 1.9 のほうが,起動が 5 秒から 23 秒に遅くなっちゃったんで,YARV 捨てられる? って質問.

こんなに起動に時間のかかるアプリをお持ちでお困りの方で,私にソースコードを送っても良い,という人がいましたらご連絡頂けると助かります.


なんというか,ここまでヤバイのは初めてだ.どうしよう.

_Yugui(Tue Dec 07 09:59:21 +0900 2010)

 実は文字列処理が多いんじゃないか疑惑

_5(Sun)

ここは空いていそうだ,と思った喫茶店が,全然空いて無くて愕然とした.なかなか,ココというお店は見つけられないものだなぁ.

_3(Fri)

Ruby 1.9 において,n バイトで収まる文字数,もしくは n バイト目が文字境界の場合は,その後ろまで取ってきてくれる方法を,中田さんに教えてもらう.

gets(nil, n) らしい.gets(nil) なんて発想ねーよ!


雨の中びしゃびしゃになりながら,着いたら快晴.


入試募集要項・専攻入試案内書

わたしの居る専攻では,冬入試を行います.まだ,大学院に行ってもいいかなぁ,とか,笹田のところで研究したいなぁ,という人が居れば,検討頂けると良いかと思います.

_mrkn(Fri Dec 10 09:43:16 +0900 2010)

 社会人って受け入れてるんですか?

_ささだ(Fri Dec 10 12:01:17 +0900 2010)

 社会人博士ってのがあるよ.

_2(Thu)

「元気な日本復活特別枠」の結果は http://seisakucontest.kantei.go.jp/article/about の資料で見れるのね。

政府情報システム刷新のためのクラウド基盤の整備事業

こういうのが A なんだなぁ。1.8 億って,どんなことするんだろ。

文部科学省の要望については、要求で一旦、形式的に廃止した扱いにした上で、増額要望していること、また、その結果、金額的にも全府省要望総額の3割を占める要望となっていることから、「特別枠」の趣旨に照らして問題が大きい。したがって、文部科学省については、全般的に大幅な要望の圧縮と、要求の削減による新たな財源捻出が必要

ふーむ。どこを目指したいんだろうなあ。

小学校1・2年生における35人学級の実現

こども手当よりも、こういう教育機会の拡充に金をかけた方がいいんでないかと思うんだけど。待機児童問題とかも含めて。

小学校は全部30人学級、担任・副担任(x 2名)を付けます、とか、どうだろう。雇用の促進にもなるだろうし。副担任は若い人、第二の人生を送ってる方とかに、ボランティアに近い形で協力してもらうとか。少子化を活かして、その代わり教育の質を上げていくとか。いや、そんな先生がいたらうざい、という意見もあるかもしれない。そういえば給食費の話もありましたね。この辺も、全部無償化で。

「強い人材」育成のための大学の機能強化イニシアティブ

自分に直接かかりそうなのはこれなんだろう。1200億円。凄い額だね。有効に回ればいいと思います。

元気な日本復活!2大イノベーション

計算機とライフ分野に 800 億円。額は大きいけど、世界一を取るには厳しいのではないか?

_1(Wed)

ムリョウ的には、「宇宙人は、実は居ました」って感じだよな。


続編やらないかな。


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 は、結構面白いと思うんだけど、知名度がない。今度、授業でこれ使うかなあ。

Sasada Koichi / ko1 at atdot dot net
$Date: 2003/04/28 10:27:51 $