type t (* void *)

ソフトウエアのこととか

ocamlのctypesで.oをリンクする

昔はもっと面倒だったと思うのですが、いつの間にか動くようになっていました。OCaml 4.07, ctypes 0.11.5で確認。
ocamloptでは普通に.oをリンクするだけでctypesで作った関数が呼び出せる。
ocamlcではできない。

open Ctypes
open Foreign

let f = foreign "f" (void @-> returning int)

let _ =
  Format.printf "%d@." @@ f ()
int f ()
{
  return 100;
}
OCAMLC=ocamlfind ocamlc -package ctypes,ctypes.foreign
OCAMLOPT=ocamlfind ocamlopt -package ctypes,ctypes.foreign

test.x: lib.o main.cmx
        ${OCAMLOPT} -o $@ -linkpkg $^

test: lib.o main.cmo
        ${OCAMLC} -o $@ -linkpkg $^

clean:
        rm *.o *.cm? *.so

# 使ってない
lib.so: lib.o
        gcc -shared $^ -o $@

%.o: %.c
        gcc -c $<

%.cmo: %.ml
        ${OCAMLC} -c $<

%.cmx: %.ml
        ${OCAMLOPT} -c $<

OCamlのformat型の変な?型付け

ツイッターやらリアルで話しすぎてどこまで書いたかわからないけどformat型についてまとめておく。 言いたいことはほとんどこれだけ。

続きを読む

antlr4の生成するプログラムのインデントがおかしい気がする

追記:普通に解決方法があった。。。。。。。。

stackoverflow.com

つらい。最新版4.7.1で確認。

gist.github.com

antlr4は{}の中にアクションを記述することができるが、複数行になるときにインデントが考慮されていない気がする。 上のプログラムでDebugParser.py の34行目、インデントがおかしいので生成したプログラムを実行しようとするとインデントエラーになる。

昼間に起きてられるおくすり

最近睡眠外来にかかってまして、検査入院の結果特発性過眠症という診断をもらいました。 原因はよく分かってないけど、昼間の眠気が非常に強いというものみたいです。

特発性過眠症 - Wikipedia

昼間に2時間に一回入眠の早さを見る、みたいな検査を受けたのですが成人が横になって入眠するのに大体15分かかるところ、ワタシは1分未満でした。 まぁうすうすなんか異常なんだろうなと思っていたものに病名が付きました。

治療する方法はよく分かってないためないらしく、対処療法で薬を飲み続けることになりました。薬を飲みはじめて数日しか経ってないけど、世界が変わるようです。 朝昼でお薬を飲んでおくと、昼間全く眠くなりません。起きてられる世界素晴らしいです。

わたしは気付いたときには既に人の話を聞いていると起きてられず、12歳くらいから授業中居眠りするようになってました。 学部生のときはとてもひどくて、毎日4つ講義あるうち全く起きてられない日もあるくらいで、学部の成績はひどいものです。 人の話を聞くことが出来ないというのはとてつもないハンデで、単位取得した講義でも全く起きてられずに夜になんとか勉強してとったものもありました。

講演会で話を聞いていても最後まで起きてられたことはほぼなくて、学会に行ってもだいたいは居眠りしてしまう状態でした。 コンピュータを使う科目は手を動かすからか眠くなりにくく(それでもたまにPCの前で寝始めるんですが、、、)、まぁこの仕事でよかったと思っていました。 が眠くなければ他の道もあったのかもなぁみたいな気持ちになります。学部生の頃に眠気覚ます薬があれば。。。。。。

f:id:no_maddojp:20180803002711j:plain

というわけで眠いですがなんとか薬でやっていくぞ。

レジスタ割付けにグラフ彩色を使うの微妙だなという話

レジスタ割付け

コンパイラはコード生成の最後に変数(無限にレジスタがあると仮定したときの仮想レジスタ)を実際のレジスタに対応付ける、レジスタ割付けを行う。 この際には一般的にはグラフの彩色問題に帰着して解く事が多い。

彩色問題の色を使用レジスタに見立てて、何色で塗ることができるかというのを求め、それが実際のレジスタ数を超えていれば spill(メモリに退避)/fill(メモリから復帰)の処理を追加して仮装レジスタの生存区間を分割し、もう一度彩色を試みる。

疑問

  • コンパイルターゲットが分かっているわけだからNはもう分かっており、N色で塗れるかどうかを解くべきで、何色で塗ることができるのかという問題を解くのは変なのでは? これはRegister-Pressure-Aware schedulingの論文を読んで、これでこんなに性能が向上するのか、、、今まで何をしていたんだ感を感じました(@tanimocchi さん @khibino さんに感謝) Register pressure aware scheduling for high level synthesis - IEEE Conference Publication
  • CPUでしかうまく動かなくないですか?
    例えばVideoCore4というGPUでは自由に読み書きできるローカルメモリがないので、スピルを行うためにはCPU側のメモリにDMA転送でに書き戻さなければならないが、スタックポインタというものはない。アドレッシングモードでBase+Offsetを計算せずにいっぺんに行うLoad命令みたいなものがないので多数の演算が必要である。 更に書き戻す先のアドレスを保持する変数が生きている必要があり、Base+Offsetの計算のための演算命令を挿入する必要がありそのレジスタも要求するようになる。

    そうすると次はその命令をスケジューリングしたり、共通式の除去などの最適化を行いたくなるだろう。フェーズ間で影響を与え合いすぎてしまう。

    スピルをしやすいアーキテクチャでしかうまくいかないのでは?という疑問

生活リズム改善

生活リズム見直し月間実施中です。

Twitterの時間制限

Androidアプリで、アプリの使用制限を入れるものを使い始めた。 この手のものはたくさんあると思うけど、一応URLを貼っておく。

play.google.com

制限は5分/30分と23:00 ~ 7:00の制限。PCでTwitterやっていると意味がない感じがするが、 電車内でKindle本を読む時間が増えた。ほんとはPDFを読もうと思ったらスマホからは読みにくすぎた。 この前の通知では週10時間くらいTwitterアプリを使っていたらしいが、このときには8時間くらいになっている。 依存。。。。

f:id:no_maddojp:20180602150407p:plain

Save My Eyes

PCで作業しているとつい熱中して目が痛くなったり腰が痛くなったりするので、 一定時間ごとに休め!って言ってくれる拡張プラグインを入れた。

chrome.google.com

30分に一回5分休憩するようにしている。これでリズムをつくっていきたい。。。

睡眠記録

最近昼間の眠気を治療したいので、入眠時間・うとうとした時間の記録をつけている。

f:id:no_maddojp:20180602145438j:plain

8時間位の睡眠を確保したいのだけど、ちょくちょく朝目が覚めていることに気づいた。
記録をつけてないときには気づかなかった。
睡眠記録をつけていると、なんだか勝手に睡眠リズムが整ってきて、生活が整ってきた感じがある。記録をつけるだけで効果があるやつだ。

情報密度が薄いコンテンツの消費をやめる

Youtube関連。みたいやつは1.5倍速で見るようになった。