AVX-512でlogその3
係数をいじったら10次まででもそこそこ大丈夫そう. いろいろやってたらexpより速くなった. 意外. ところでrdtscというのは何を測ってるのだろう.
github/mcl, bls, 最近ドキュメント関係の質問多いな. ドキュメント書くの面倒なので自業自得なんだがどうしたものか.
AVX-512でlogその3
係数をいじったら10次まででもそこそこ大丈夫そう. いろいろやってたらexpより速くなった. 意外. ところでrdtscというのは何を測ってるのだろう.
github/mcl, bls, 最近ドキュメント関係の質問多いな. ドキュメント書くの面倒なので自業自得なんだがどうしたものか.
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日以上前から, 社内のいろんな人達が相談していた. 部長たちの議事録も会議後ただちに公開される. 相談もせずに独断で勝手に発表は準備もできないし最悪手だね.
逆数を使う方法で実装してみた.
// 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); }
AVX-512でexp
指数関数expのAVX-512によるベクトル化書いた. 昔よりだいぶ簡単になってる.
『まんが医学の歴史』(茨木保)
これは大作だ. いろいろ勉強になった. 野口英世の駄目っぷりがなかなか.
在宅勤務推奨
政府の対応見てると後手後手な印象が否めない. 最初から専門家の声を聞いていればとしか. 隠蔽体質, 非論理な人達をトップに選んでしまってるのだからどうしようもないが.
落とし物
朝歩いてたら見つけたので交番に届けてみる. 今は3カ月らしい. 昔は半年だったような.
-ftime-report
gccの -ftime-reportでプロファイル. パーサに時間がかかってる. 関数減らせないかな.
xbyak_aarch64
ちまちまと改良. コンパイル時間が遅いのなんとかならんかな. 何に食ってるのかな.
カーネル/VM勉強会視聴
中継してくれるのありがたい. 感謝.
面白かった. ガスを少ない圧力で小さいところに詰め込んで運搬できるといいな.
bls for Rust
Rustのテストコード追加. 違う言語をいろいろ触ってると混乱するなあ.
bls for Wasm
WebAssembly用のAPI追加.
bls for Go
Go用のAPIを追加.