憂鬱な午後のひととき

2月28日_

AVX-512でlogその3

係数をいじったら10次まででもそこそこ大丈夫そう. いろいろやってたらexpより速くなった. 意外. ところでrdtscというのは何を測ってるのだろう.

github/mcl, bls, 最近ドキュメント関係の質問多いな. ドキュメント書くの面倒なので自業自得なんだがどうしたものか.

2月27日_

AVX-512でlogその2

思いの外FMAが速い感触だったので逆数じゃなくて普通にMaclaurin展開してみたらどうだろう. log(1 + x)で1<=x<2だからy = 1.5(1 + a)と変換すれば |a|<=1/3. 12次でa^12/12 = 1.5e-7だから逆数の代わりにこれを使ってもペイするのかな.

コロナウイルスの影響で当分在宅勤務(一部拠点における原則在宅勤務の実施). ちなみに首相の単なる思いつきによる休校発表より前. 10日以上前から, 社内のいろんな人達が相談していた. 部長たちの議事録も会議後ただちに公開される. 相談もせずに独断で勝手に発表は準備もできないし最悪手だね.

2月26日_

AVX-512でlog

逆数を使う方法で実装してみた.

// zm0 = log(zm0)
vpsubd(zm1, zm0, i127shl23);
vpsrad(zm1, zm1, 23); // e
vcvtdq2ps(zm1, zm1); // float(e)
vpandd(zm0, zm0, x7fffff);
vpord(zm0, zm0, i127shl23); // y

vaddps(zm2, zm0, sqrt2); // y + sqrt2
inverse(t1, zm2, t2);
vfmadd213ps(zm1, log2, log2div2); // e

vsubps(zm0, zm0, sqrt2); // y - sqrt2

vmulps(zm2, zm0, t1); // a
vmulps(t1, zm2, zm2); // b
vmovaps(zm0, logCoeff[3]);
vfmadd213ps(zm0, t1, logCoeff[2]);
vfmadd213ps(zm0, t1, logCoeff[1]);
vfmadd213ps(zm0, t1, logCoeff[0]);
vfmadd213ps(zm0, zm2, zm1);

1loop(float x 16)あたり12clk. expだと8.6clkぐらい. vrcp14psのレイテンシは7clk. 変換で結構手数を食ってるので素直にテイラー展開でがんばる方がよいのかな. 次比較してみる.

今回のアルゴリズムメモ

x = y * 2^e (1 <= y < 2)
log(x) = e log2 + log y
a = (y - sqrt(2)) / (y + sqrt(2))
|a| <= (sqrt(2) - 1)/(sqrt(2) + 1)
y = sqrt(2) (1+a)/(1-a)
log(x) = e log2 + 1/2 log 2 + log((1+a)/(1-a))
log((1+a)/(1-a)) = 2a(1 + a^2/3 + a^4/5 + a^6/7)
b = a^2
log(x) = (e+1/2) log2 + 2a(1 + b(1/3 + b(1/5 + b/7)))

log y (1 <= y < 2)の計算で収束を速めるために a = (y - sqrt(2)) / (y + sqrt(2))の変換をする. 逆数はマニュアル通り, vrcp14psとNewton-Raphson法.

void inverse(const Zmm& out, const Zmm& in, const Zmm& t)
{
    assert(!(out == in && in == t));
    /*
        t = rcp(x)
        1/x = 2 * t - x t^2
    */
    vrcp14ps(t, in);
    vaddps(out, t, t);
    vmulps(t, t, t);
    vmulps(t, t, in);
    vsubps(out, out, t);
}

順序入れ換えてmul + addをfmaddにして10clkちょいになった.

inverseの代わりに-1/xを使うとmul + subをfmsubにできる? 辻褄合わせをしたら速くなるのかな.

速くなった. 9.5clk.

// out = -1/in
void inverseNeg(const Zmm& out, const Zmm& in, const Zmm& t)
{
    assert(!(out == in && in == t));
    /*
        t = rcp(x)
        -1/x = -(x t^2 - 2t)
    */
    vrcp14ps(out, in);
    vaddps(t, out, out);
    vmulps(out, out, out);
    vfmsub213ps(out, in, t);
}
2月21日_

AVX-512でexp

指数関数expのAVX-512によるベクトル化書いた. 昔よりだいぶ簡単になってる.

2月19日_

『まんが医学の歴史』(茨木保)

これは大作だ. いろいろ勉強になった. 野口英世の駄目っぷりがなかなか.

2月17日_

在宅勤務推奨

政府の対応見てると後手後手な印象が否めない. 最初から専門家の声を聞いていればとしか. 隠蔽体質, 非論理な人達をトップに選んでしまってるのだからどうしようもないが.

2月13日_

落とし物

朝歩いてたら見つけたので交番に届けてみる. 今は3カ月らしい. 昔は半年だったような.

2月10日_

-ftime-report

gccの -ftime-reportでプロファイル. パーサに時間がかかってる. 関数減らせないかな.

2月9日_

xbyak_aarch64

ちまちまと改良. コンパイル時間が遅いのなんとかならんかな. 何に食ってるのかな.

2月8日_

カーネル/VM勉強会視聴

中継してくれるのありがたい. 感謝.

2月7日_

分子でつくる小さい空間の話

面白かった. ガスを少ない圧力で小さいところに詰め込んで運搬できるといいな.

2月6日_

bls for Rust

Rustのテストコード追加. 違う言語をいろいろ触ってると混乱するなあ.

2月5日_

bls for Wasm

WebAssembly用のAPI追加.

2月4日_

bls for Go

Go用のAPIを追加.


御意見は光成滋生<herumi@nifty.com>までお願いします