読者です 読者をやめる 読者になる 読者になる

muranoyaのブログ

https://github.com/muranoya

引越し

引越しと後輩の卒論発表などがあり2月の後半は忙しかった.

ようやくどれも終わり,今日は上野動物園国立科学博物館に行った.上野動物園は流石に土曜とあって人が多い.入場料大人600円は安い.園内は広く,全ての動物などを見ようとすると時間がかかる.私はだいたい2時間程度歩きまわってようやくほぼすべてを周れた.人が多くいちいち写真を取る気にはなれなかったので写真はない.

国立科学博物館は,提携大学であれば無料で入場可能だが,提携しているのはほとんどが都内あたりの大学だったので,私は入場料大人620円を支払った.館内の構造はあまり把握しきれなかった.国立科学博物館のウェブサイトにフロアマップがあるので,事前に頭に入れておくと良いような気がする.私は上野動物園を周ったあとで疲れていたので,日本館はスルーして,地球館だけ展示を見た.

上野動物園国立科学博物館どちらも面白かったが,カップルが相当多いので気をつけるように.

また,帰りに秋葉原ヨドバシカメラに行ってみたが,これまた人が多い.そしてキーボードのキネシスは売っていなかったので,すぐに帰った.秋葉原のどこかには売っている店があると思うのだが.また機会があれば,今あるデスクトップのケースが大きいので,もっと小型でミドルレンジのグラフィックスボードが刺さるようなケースを探しにいきたいと思っている.

pause命令

修論発表も終わって暇になったので最近は,カットシステムの「構造化並列プログラミング」を読んでいる.

この本は1年くらい前に購入して1章だけ読んで積んでいたもので,結構分厚いので読むのに根気がいる.研究分野的に,Intel Cilk PlusやIntel TBBは頻繁に出てくるので,構造化並列プログラミングも1章はサクサク読み進めることができる.まあ1章は何も新しいことは言っておらず前置きなので,真面目に読んでもあまり意味は….

ところで,カットシステムは,2年前にXeon Phiコプロセッサの本を読んだので覚えている.構造化並列プログラミングと同じような表紙だったと記憶しているが,構造化並列プログラミングはどうもIntelのプロダクトがかなり出てくる(実際Intelが買収したMIT Cilkは凄いので,Cilk Plus推しなのは理解できるが)ので,Intel関連の出版社なのかと思ったが違うらしい.

構造化並列プログラミングの最初に,Intel ArBBは関数ポインタで渡された関数も動的にインライン展開するのでベクトル化が可能,というような記述があるが,これは本当なのだろうか.Intel ArBB自体この本を読むまで知らなかったのでどんなものなのか,全く知らないのだが,関数を動的にインライン展開なんて出来るものなのか….とりあえずググったら丁寧にも日本語に翻訳された論文が出てきたので,これを後で読むことにする.

 

本題であるが,SSE2で追加されたpause命令を使うことでスリープループの性能を改善できるらしい.SSEとAVXは昔演習で使ったことがある.その時はひたすら使えそうな命令はないかとワクワクしながら調べていたものだが,こんな命令もあったのか.

SSEとAVXあたりは普通の命令も多いけど,AESやTSXなんかの少し変わった命令もある(直接使ったことはない).

パフォーマンスカウンタ

とあるAMDのマシン上で性能評価を行っていたら,最適化オプションをつけないほうが,O2最適化のバイナリよりも2倍程度早い,という事象に出くわして原因を探ろうとしていたが,よくわからない.

普段どこがボトルネックになってるとかっていう情報はprintfでgettimeofdayとか,なんらかのウォールクロック関数などを使って調べることが多くて,もっと詳細な調べ方,というのを今まで気にしてこなかった.

調べると,linuxではperfコマンドが良いらしい.早速使ってみる.

perfの使い方

perfコマンド,というよりもパフォーマンスカウンタは凄い.ありとあらゆる情報がわかるではないか.これは凄いぞ.普段,メモリリークを調査するためにvalgrindは使うが,perfは使ったことがなかった.これからは必須ツールの仲間入りだろう.

ところで,標準ライブラリにあるsqrt関数を使うと,sqrt関数呼び出しをsqrt命令に置き換える最適化をGCCは行う.次のCコードが,

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int
main(int argc, char *argv[])
{
    printf("%lf\n", sqrt(atof(argv[1])));
    return 0;
}

GCCでO2最適化を入れてコンパイルすると,

main:
.LFB41:
	.cfi_startproc
	subq	$24, %rsp
	.cfi_def_cfa_offset 32
	movq	8(%rsi), %rdi
	xorl	%esi, %esi
	call	strtod@PLT
	sqrtsd	%xmm0, %xmm1
	pxor	%xmm2, %xmm2
	ucomisd	%xmm0, %xmm2
	jbe	.L2
	movsd	%xmm1, 8(%rsp)
	call	sqrt@PLT
	movsd	8(%rsp), %xmm1
.L2:
	movapd	%xmm1, %xmm0
	leaq	.LC1(%rip), %rsi
	movl	$1, %edi
	movl	$1, %eax
	call	__printf_chk@PLT
	xorl	%eax, %eax
	addq	$24, %rsp
	.cfi_def_cfa_offset 8
	ret

のようになる.
面白いと思ったのは,sqrt関数を呼び出す命令も生成している点で,これはsqrt命令で計算を行った後(xmm0レジスタの中身をsqrtし,結果はxmm1レジスタに入る.xmmはSSEで使われる128bit長のレジスタ.ちなみにAVXでは256bitのYMMレジスタ,AVX-512では512bitのZMMレジスタがある),ucomisd命令で0とsqrt前の値の比較を行っている.
ucomisd命令直後のjbe命令でジャンプするのは,フラグレジスタのCFかZFが立っているときで,ucomisd命令によりそのフラグが立つのは,比較する2つの値が比較できないか,src1 >= src2のときである.
つまり,負数やNaNなどでsqrtしたときにはsqrt関数を呼び出すようになっている.
pxor命令で同じレジスタ同士をxorしているのは,ゼロクリアのよくある方法.

CPU,コンパイラ,OSを作りたい

昔からコンパイラとOSは作ってみたいと思っていた.実際コンパイラはいくつか試行錯誤してきたが,目標としているC99完全準拠したものはできていない.

しかし今まで何度か挑戦してきた感じからして,もう少しで出来そうな感触はある.これは@rui314さんの8ccにかなり感化されている.

個人的な興味のテーマとしては,特に目新しくもなく車輪の再開発ではあるが,LRパーサジェネレータを作り,構文解析をすることだ.有名なパーサジェネレータであるYaccはLALR法であり,これはLR構文解析の表をコンパクトにすることでメモリ消費量の削減を行ったものだが,現代のマシンではもはやLR法でよいのではないか,という意見はちらほら聞く.1〜2年前に研究室の先生に,上記のような事を述べたところ,C言語で書くのか?と聞かれ,セルフコンパイルしたいのでそうだ,と答えたところ,それはおすすめしない,セルフコンパイルできればよいのなら,Lisp処理系をC言語で書いてLispでパーサジェネレータを書くべきだ,と言われた.確かにLispが使えればLR構文解析で必要な集合計算は容易になるだろう.そこだけに絞った処理系ということであれば,C言語でも1000行程度あれば良いのではないか,という気もする.

手で書くのであればLL構文解析になるが,今までやってきた感想からいって,やはり面倒である.というのは,C言語の関数ポインタ周りなどを考えるとどうしても面倒だと思ってしまう(実際それほどLLパーサを書くのは難しくは無いと思うのだが…私個人の不勉強もある).

また,OSについては有名な,30日で作る自作OS本など情報は多く取り組みやすいと思う.

さて,ここまできて後は何があれば面白いか?それはやはりCPUであろう.というわけで,FPGAでCPUを作りたい.これについてもいくらか書籍が出ているし,FPGAのボード自体も数万で買えるので問題ないと思っている.どういう命令セットを作るのか,は難しい問題だ.最近良く見るのはゲームボーイスーファミなどのエミュレータを作った,という話であるが,あのあたりのゲームの実行ファイルなどの仕様がどこに転がっているのかよくしらない.そもそも吸いだしたゲームソフト自体はどこで手に入れればよいのだろう.

しかし最も問題なのは英語だ.例えばx86やArmの資料は大部分が英語だ.また,論文を読むにしても結局英語が必要になる.気になる本もいくつかあるが,洋書だ.英語は嫌いではないが,やはり読むのに時間がかかってしまうことなどを考えると読むのがだんだんと億劫になってしまう.最近はGoogle翻訳が良い翻訳結果を出すようになってきたので,とりあえず投げてよくわからない部分は原文を読むのが良いのだろうが….

七輪の会2回目

先週は雨で休みだったので今回が2回目の七輪の会.

七輪の会は,共有研究室環境,分散研究室環境におけるコミュニケーションを促進するための会です.和やかに色々な意見を交わしましょう.

2回目の今回は体調不良により人が集まらず,当日集まったのは2人という,最低催行人数ギリギリとなりましたが,途中で1人発見し3人になったので人数的にはまずまず.最低催行人数は1人です.

4〜5人を想定していたため2つめの七輪を購入していましたが,出番なく.人数も少なかったため,肉の買い出しはやめて餅を焼くことに.手元に鏡開き前の鏡餅があったので,それを鏡開きし,一般的な餅も焼くことにします.

当日は風が強く,気温もあがらず日もささないという,厳しい自然環境の中でしたが,なんとか着火剤に点火すると,うちわで扇がずともボウボウと炭に燃え移り終始,炭は絶好調でした.そのおかげで遠赤外線とはなんぞや,と言わんばかりに餅は焦げまくり,口の中が炭だらけになりました.

f:id:muranoya:20170211141850j:plain

冷凍庫を空にしたくて,冷凍していた鶏胸肉を持って行きましたが,そのままやいてもすぐ火が通ってよかった.一時はどうなることかと.

f:id:muranoya:20170211142020j:plain

鶏胸肉は一般にパサパサしていて好まない人が多いですが,七輪で焼くと美味.鏡餅はどうすれば焼けるのかわからないので,定期的に回して様子見.

f:id:muranoya:20170211142136j:plain

ふーむ.

f:id:muranoya:20170211142202j:plain

うまい.

この後は普通の餅を焼いて時間を潰していましたが,寒すぎて私はずっと足踏みしていました.まるでボストンダイナミクスBigDogみたいでした.

今回は寒すぎて反省会や総括がなかったのですが,次回は焼き鳥を焼きたいということになりました.たぶんそうなるとおもいます.

実は,後片付けの途中にうっかり左手の指を火傷してしまいましたが,痛みがあるので大丈夫でしょう.とりあえず,我が家では火傷にはトフメルを塗布するのが鉄板でありまして,これで2〜3日すればなんとかなるとおもいます.

クラッシュアイスゲームを買った

先日購入したラブレターと一緒に購入したクラッシュアイスゲームが今日届いた.

 

f:id:muranoya:20170210230737j:plain

クラッシュアイスゲームは,ツイッターで話題になっていたものでアマゾンで見るとそれほど高くない金額で面白そうだったので購入した.私はまだボードゲーム初心者なのでそれほど多くのボードゲームを知っているわけではないのだが,他のゲームが紙のカードやコンポーネントとしてボードや木製のキューブなどを使うものは多くあるが,クラッシュアイスゲームはプラスチックのコンポーネントだけだ.

このゲームは1プレイ5分もかからないように思う.面白いのは面白いが,アイスブロックをはめ直すのが面倒で,付属のルーレットはうまく回らない.

ハンマーでアイスブロックを叩いて落とすのは中々新鮮である.ただ,そんなにやり込むことができるのか,と言われると難しい.ゲーム進行はブロックを落とすだけで単調になりがちなように思う.その単純さが売りのような気もするので特に欠点というわけでもない.

 

ボードゲーム「ラブレター」

ボードゲームのラブレターを買った.

f:id:muranoya:20170209005654j:plain

ボードゲーム買うときに必ず見るたっくんさんのサイトではそこそこの評価.

プレイ感想は安い,早い,簡単.

今までカルカソンヌや,交易王,パンデミックカタンと最低でも30分以上かかるゲームを購入してきたけど,ラブレターはかなりあっさりしていて,山札に入れるカード次第では,5分もかからず終わる.

ちょっとした空き時間にやるとちょうど良さそう.

難点というと,人数が必要という点かな.パッケージには2〜4人くらいまで,と書いてあるけど,最低でも4人は欲しい,という感じ.5人でやっても楽しめるし,入れるカードを工夫すると結構な人数でもいけそう.あと,追加カードが入っているので,カードを入れ替えたり,単純に追加しても楽しめる.

ラブレターはゲームとしても気に入ったけど,カードの絵も結構好き.

1500円くらいで買えるから,ボードゲームとしては安い方だと思うけど,ゲームに使うコンポーネントはカード16枚+追加カード6枚だけなので少し高いのかなと思ってしまった.でも,テキストレス版(効果説明が書いてない)のカード22枚とトークン(基本的には使わない)もあるし,価格はこんなもんか.