アセンブリ解読 小休止

これまで、4回に渡ってコンパイラ(gcc v5.4.0)の生成するアセンブリコードを解読してきた。これまでの内容は、以下のような感じになる。

  1. その1: レジスタの使い方、関数の定石、初歩的な最適化
  2. その2: 条件分岐、除算の最適化
  3. その3: 除算の最適化と定数伝播、リンク時最適化
  4. その4: ループと自動ベクトル化

これまでは、私が読んでいく過程で何を思ったかをだだ漏れに垂れ流していたので、推敲も何もあったものではなく、読みやすくわかりやすい記事というには程遠かった。 ここで一度小休止してここまでのちょっとしたまとめをしてみよう。ただし、既にそれぞれの記事を読んでいる人にはこれは無意味な記録ということになる。 あと、私にはアセンブリの解説ができるほどの技量はまだないので、そういう方向の期待はあまりしないでほしい。

続きを読む

アセンブリ解読 その4

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

今回とりあえずこんなコードを書いた。

#include <stdint.h>

int32_t accum(const int32_t* begin, const int32_t* end)
{
    int32_t sum = 0;
    for(; begin != end; ++begin)
        sum += *begin;
    return sum;
}

beginからendが到達可能ならそこまでの範囲を総和する。到達不能なら知らない。

続きを読む

アセンブリ解読 その3

前回長くなりすぎたので、追記分を分けておくことにした。

前回は簡易fizzbazzを逆アセンブルし、割り算の最適化に関して面白いものを見たのだった。

アセンブリ解読 その2 - in neuro

その続きとして、moduloではなく普通の割り算はどうなるんだろう、と思って以下のようなコードを書いてみた。

#include <stdint.h>

int32_t div_by3(int32_t a)
{
    return a / 3;
}

int32_t div_by4(int32_t a)
{
    return a / 4;
}

int32_t div(int32_t a, int32_t b)
{
    return a / b;
}

アセンブルする。予想としては、div_by3は先のマジックナンバーを使った方法を、div_by4sarで右シフトを、divは普通にidiv命令を使うというものだ。 それがたとえ-O0であったとしても。

続きを読む

アセンブリ解読 その2

続いた。でもいい題材が思いつかなかったので、条件分岐とかがいいかなあと思いじゃあfizzbazzでいいか、となった。

その1はここにある。アセンブリ解読 その1 - in neuro

文字列を使うのが(アセンブリだと)アレなのでフラグを返すことにする。

#include <stdint.h>

uint8_t fizzbazz(const int32_t n)
{
    uint8_t retval = 0;
    if (n % 3 == 0) retval ^= 1;
    if (n % 5 == 0) retval ^= 2;
    return retval;
}

3のみの倍数なら1、5のみの倍数なら2、両方の倍数なら3が返るはず。

続きを読む

アセンブリ解読 その1

簡単なアセンブリを読めるようになりたい。理由はカッコいいから。というのは嘘で、どういう最適化が行われたかある程度わかるようになりたい。

だが、面白いコードが書けるようになるまでにアセンブリだと道のりが遠すぎるので、コンパイラに簡単なコードを吐かせて読んでわかるようになっていくことを目指す。というか、本来の目的は最適化で何が起きたかわかるようになることなので、最短距離といえばそうではある。

続きを読む

何らかのフォーマットのファイルを読み書きするライブラリについて

Coffee-millなるライブラリを(凄く昔に)書いている。これは主に分子動力学計算の結果を読み書き・解析するためのものなのだが、解析用の部分は別に開発しているのでまあほぼ読み書きのために使っている。今やっていることが落ち着いたらもう少しメンテしたい気持ちはあるが、今回は思い出しがてらそれを開発していた時に何を考えていたかを綴っていこうと思う。

続きを読む

Rustを触っている

先週Rustを触っていた。まだ手に馴染んでいないので少し不自由さを感じるが、慣れるまでの辛抱だろう。実際は去年くらいに一度インストールしてチュートリアル程度は済ませていたのだが、説明を見て言われた通りのコードを書く以上のことはしていなかった。なので、少し柔軟体操程度のことをしてみるか、とProject Eulerの問題をいくつか解いてみた。これは触ってみただけのひどく個人的な感想にすぎず、Rustの紹介を気合を入れてしている訳ではない。

続きを読む