11/22 (土)
[Movie] インターステラー
川崎チネチッタで『インターステラー』を観た。 この映画凄かった。 最初幽霊の登場や別の銀河からの「彼ら」が送ってきた通信とかで予定調和のラストは予測できるのだが、それでもぐっときた。 何が良かったのか思いなおすと登場人物の設定がいい。 いわゆる villain がいない映画なのだが、善良な人間の中にある屑さが極限状態で顕現化する。 ブランド教授が屑、トムも屑、マン博士も屑。
あと一方、ロボットが非常にカッコイイ。 アクセル・ワールドのブラックバイスみたいなデザインいかす。
11/17 (月)
整数除算で0以外にも例外が出るのね
コンピュータアーキテクチャーで 0 除算時に例外やエラーが発生するのは当たり前だけど、符号付き整数の除算では -1 で割った場合にも例外が生じることがあるのね。 signed int 同士の除算だと INT_MIN / -1 を実行すると、x86-64/Linux では Floating point exception が発生する。
INT_MIN は -2147483648 だからこれを -1 で割ると +2147483648 になる。 一方、signed int 型に格納できる最大 INT_MAX は +2147483647 なのでオーバーフローしてしまうのね。
C言語の規格は 0 除算は未定義
と規定があるが、INT_MIN / -1 に対する明確な規定はない。
ただし ((a / b) * b + a % b) == a
を満たすことという規定がある。
a が INT_MIN で b が -1 なら a % b
は 0 なので、(INT_MIN/-1) は -INT_MIN。
これは 2の補数だとオーバーフローにならざるえない。
コンパイラは定数畳み込みで INT_MIN / -1 を見つけると警告を出すが、変数の除算だとアーキテクチャ毎の命令を生成する。 その場合、どのような結果になるかはアーキテクチャー次第になる。 次の表に代表的なアーキテクチャの符号付き整数除算命令と、その振る舞いについてまとめてみた。
アーキテクチャ | 命令 | 幅 | オーバーフローの扱い | ゼロ除算の扱い |
---|---|---|---|---|
IA-32 & x86-64 | IDV | int64 / int64 | #DE 例外が発生 | |
MIPS (MIPS4) | DIV | int32 / int32 | 不定値が返る。例外はあがらない。 ただし過去に SGI が出していたハンドブックでは、コンパイラまたはプログラマーが除数の 0 チェックをし BREAK 命令で例外をあげることを求めている。 |
|
DDIV(Divide Word) | int64 / int64 | |||
SPARC (SPARC V9) | SDIV & SDIVcc | int64 / int32 |
オーバーフローすると近似値になる。 上限をオーバーフローすると 231 -1 (0x0000,0000,7FFF,FFFF) に、 下限をオーバーフローすると -231 (0xFFFF,FFFF,8000,0000) がセットされる。 |
division_by_zero 例外があがる。 |
SDIVX & SDIVXcc | int64 / int64 |
最も大きい負の値を -1 で割ると、最も大きい負の値になる。 INT_MIN / -1 → INT_MIN。 |
division_by_zero 例外があがる。 | |
ARM (ARMv8 64-bit) | SDIV | int32 / int32 | 例外をあげないが、結果として 0 が返る。 | |
int64 / int64 | ||||
PowerPC | divw | int64 / int32 | 未定義値が返る。もし OE が 1 なら、CR0 に OV がセットされる。 | |
divd | int64 / int64 | |||
PA-RISC (PA-RICS 2.0) | Nothing | PA-RISC に直接的な整数除算命令はない。 替わりに DS(Divide Step) という命令がある。 | ||
IA-64 | Nothing |
整数除算命令はない。
浮動小数で代用するが、浮動小数も直接的な除算命令はない。 ただしコンパイラが除数が 0 の場合は例外を上げるコードを挟み込む。 |
アーキテクチャ毎にかなり振る舞いが違うのね。
11/15 (月)
ティム・バートンの世界@森美術館
六本木ヒルズの森アーツセンターギャラリーで『ティム・バートンの世界』を観る。 ティム・バートンが描いたスケッチ、映画のイメージボード、絵画などが大量に展示されている。 バートンの直筆画が見たいという人にはお薦め。 ただ展示されている全作品を載せた図録が1万円というのは高過ぎるなりよ。
[Movie] エクスペンダブルズ3
川崎の109シネマズで『エクスペンダブルズ3』を観る。
11/10 (月)
x86-64 命令の動作の勘違いでバグが混入
x86-64 の mov imm16, %regw
命令は下位 16 ビットに値を設定し、上位 32 ビットを 0 にし、真ん中の 16 ビットの値を変えない変態命令であることを忘れていた(上位 48 ビットを全部 0 にしてくれると思っていた。
レジスタの上位ビットにゴミが入ってバグが発生していた。
NARUTO が終わった
週刊少年ジャンプの 10 年以上の連載物で、掲載がはじまった回を見たのが完結するのを見るのは初めて。
"l" と "1" は似ている
更新したパスワードがどうしても正しく入力できないと思ったら "l" と "1" を間違っていた。
11/6 (木)
シンガポール証券所が電源異常で 3 時間ダウン
11月5日の Singapore Exchange(SGX) の株取引と社債・ディリバティブの取引システムがダウンしたそうな。 障害は現地時間の 14:18 に発生し、株取引マーケットは 17:15 に再開できるまで 3 時間近く停止したままになっていた。 デリバティブ取引マーケットは午後 19:00 まで再開しなかった。
原因は電源異常のようだが、多重の冗長化は行われていたはず。 それをすり抜けて問題が生じたのはなぜなのか、原因究明までには時間がかかるようだ。
参考
11/5 (水)
[MyWeb] pib を更新
RDMAmojo の Dotan Barak さんから直々に pib のパッチをいただく。 これまで pib は x86-64 環境でのみ動作していたが、Dotan さんはは 32-bit x86/Linux 環境で試してくれたそうだ。 この機会に 32-bit x86/Linux で生じるコンパイル & リンクエラーを取り除いて、pib を i686 と x86-64 の両対応にした。
今回の修正でプラットフォーム固有のコードはなくなったので、理論上は big endian の Linux 箱とも通信は可能なはず。
[Prog] C 言語のプリプロセッサ
C 言語のプリプロセッサの動作について一部うろ覚えだった箇所があることが判明。
pib のソースコード中では Linux カーネルのバージョンチェックを行うが、RHEL カーネルは RDMA 周りにパッチが多数あたっておりカーネルバージョンだけでは区別が付けられない。 これは RHEL_MAJOR や RHEL_RELEASE_VERSION() といったマクロを使って判定することになる。
RHEL_MAJOR マクロが存在するかどうかで判定し RHEL カーネルソースコードかどうかを区別し、RHEL カーネルソースコードならそのバージョンチェックを行うことにする。 そこで RHEL 6.6 以上かどうかを判定する意図で、以下のようなコードを書いたらコンパイラに RHEL_RELEASE_VERSION() がないと起こられた。
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) || \ (defined(RHEL_MAJOR) && (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 6))
defined(RHEL_MAJOR)
が偽であればその右側は評価されないつもりでいたのだが、プリプロセッサの中のマクロは短絡評価がなされない。
そのため RHEL_RELEASE_VERSION() が見つからないとなかれたいたようだ。
結局、以下のように書き改めた。
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) || \ (defined(RHEL_MAJOR) && (((RHEL_MAJOR == 6) && (RHEL_MINOR >=6)) || (RHEL_MAJOR == 7)))
もう一つ鯉江さんに言われて気づいたのだが、
@nminoru_jp うろ覚えですが定義されてないシンボルは0と見なされたような気がします。
— 鯉江 (@koie) 2014, 11月 5
#define の中では、未定義マクロはすべて 0 で評価されることになるようだ。 未定義マクロはエラーを出してくれると信じていたのに!
11/1 (土)
[Movie] ドラキュラ Zero
ひさしぶりにチネチッタで『ドラキュラ Zero』(原題:Dracula untold)を観てきた。 事前の番組宣伝では VAMPS のイメージソングというのが使われていたが、字幕版だと作中でもスタッフロールにも登場しなかった。
ストーリーはオスマントルコ帝国を撃退するためにブラドが悪魔と契約してドラキュラになるという予告そのままのおmの。 だけど時代を現代に写した二作目以降が用意されているような終わり方だった。 ただ『HELLSING』もそうなんだけど、ドラキュラをかっこよく描くと、ブラム・ストーカーの『ドラキュラ』のイメージから離れてしまうのはいかんともし難い。 ルーク・エヴァンスも過去にヘルシング博士と戦った『ドラキュラ』だと言われると違和感が拭えないよね。
P.S.
映画の冒頭にある映画泥棒が新しいバージョンになっていた。