asm

アセンブリ解読:Fortran配列の中身

前回の続きです。 以下のコードを-O3でコンパイルすると、 pure function nth(v, n) result(out) implicit none integer, intent(in) :: v(:) integer, intent(in) :: n integer :: out out = v(n) return end function nth こんなアセンブリになって驚いた…

x64で配列の添字にintを使うと遅い

こういうツイートを見た。気になったので試してみたら本当にそうらしい。 x64でEAXに値を入れるとRAXの上位は(符号拡張ではなく)0になる。なのでC/C++で配列の添え字に32bit整数を使うと符号拡張命令が追加されて遅くなる。LP64環境で配列の添え字にintを使…

リテラル数値と精度について

背景 C++では1.0とか書くとdoubleとして解釈され、floatにするには1.0fなどと書かねばならないことはご承知のとおりだ。また、doubleとfloatの演算の結果はdoubleになる。 これはtemplateを使うときに若干面倒になる。例えば、以下のような関数fを実装したと…

reluを分岐無しで実装する

ReLUとは、ご存知の通り、xが正の値ならxを返し、そうでなければ0になるという非常に単純な関数である。だがこれが深層学習において重要な役割を演じたのだから面白い。バックプロパゲーションをする時に微分係数が1より小さいよくある活性化関数だと指数的…

バイナリアンに出会った話

飲み会の席で隣に座っていた人が、聞いてみるとゲームのデバッガーをやっているらしい。でも開発プロジェクトの一員という訳ではなくて、コードそのものは見られない立場にいるらしい。なんだそりゃ、と思ったが、そういえばテストプレイヤーの募集を見たこ…

コンパイラの最適化と専用命令について

asm

Fast inverse square rootなるものをご存知だろうか。これは、1.0 / sqrt(x)を高速に近似計算する命令である。 Fast inverse square root - Wikipedia この計算は非常によく使う。例えばベクトルがあるとする。このベクトルを規格化したい。つまり長さを1に…

アセンブリ解読 小休止

asm

これまで、4回に渡ってコンパイラ(gcc v5.4.0)の生成するアセンブリコードを解読してきた。これまでの内容は、以下のような感じになる。 その1: レジスタの使い方、関数の定石、初歩的な最適化 その2: 条件分岐、除算の最適化 その3: 除算の最適化と定数伝播…

アセンブリ解読 その4

asm

その2で宣言した通り、今回の対象はループだ。その2に続きが発生したので番号的には飛んでしまっているが、続きという点は変わらない。 しかしループとなると絶対にSIMDとループアンロールが絡んで面倒なことになる、と思っているので少し腰が重いが、最適化…

アセンブリ解読 その3

asm

前回長くなりすぎたので、追記分を分けておくことにした。 前回は簡易fizzbazzを逆アセンブルし、割り算の最適化に関して面白いものを見たのだった。 アセンブリ解読 その2 - in neuro その続きとして、moduloではなく普通の割り算はどうなるんだろう、と思…

アセンブリ解読 その2

asm

続いた。でもいい題材が思いつかなかったので、条件分岐とかがいいかなあと思いじゃあfizzbazzでいいか、となった。 その1はここにある。アセンブリ解読 その1 - in neuro 文字列を使うのが(アセンブリだと)アレなのでフラグを返すことにする。 #include <stdint.h> </stdint.h>…

アセンブリ解読 その1

asm

簡単なアセンブリを読めるようになりたい。理由はカッコいいから。というのは嘘で、どういう最適化が行われたかある程度わかるようになりたい。 だが、面白いコードが書けるようになるまでにアセンブリだと道のりが遠すぎるので、コンパイラに簡単なコードを…