WASM
GoやC#ではUint64Arrayをそちらで確保したメモリをCに渡せたのだけど, JavaScriptではModule._malloc()で確保された領域でないといけないようだ(何か他に方法がある?).
そうすると自分でfreeしないといけない. JavaScriptにはデストラクタが無いのでどうしよう.
WASM
GoやC#ではUint64Arrayをそちらで確保したメモリをCに渡せたのだけど, JavaScriptではModule._malloc()で確保された領域でないといけないようだ(何か他に方法がある?).
そうすると自分でfreeしないといけない. JavaScriptにはデストラクタが無いのでどうしよう.
vp4dpwssd
mkl-dnn/blob/master/src/cpu/jit_avx512_common_1x1_conv_kernel.cppとか眺めてるといろいろ勉強になる.
ああ, こうしとけばより便利に使ってもらえたのかとか.
サイボウズ・ラボユース合宿3
全体の様子. サイボウズ・ラボユース合宿2017開催
サイボウズ・ラボユース合宿2
あなたの知らないnopたち@ラボユース合宿. MPXのエンコーディングは職人芸だなあ. よくまあうまいこと思いついたものだ.
サイボウズ・ラボユース合宿1
会場はマホロバ・マインズ三浦. 久しぶりに海を見た.
MPXの命令表記法
bndldx, bndstxはbaseレジスタ+displacementとindexレジスタの2個の引数をとる. 命令的にはbndldx, bnd0, base, disp, indexでよいと思うのだがbase, indexはどちらかが省略されてもよい. それで
bndldx bnd0, [base + index * scale + disp]
という表記を採用したのかな. これだとbaseやindexが空でもOK. かなりこじつけ感がするが. ただ[base + disp]と[index + disp]の区別がつかないのでscale = 2とかにして区別することにしたのだろうか(scaleは無視される).
bndldx bnd0, [base] bndldx bnd0, [index * 2]
分かりにくいせいか3オペランドタイプ表記もあるようだ.
bndstxは
bndstx [rcx], bnd0, rax bndstx [rcx], rax, bnd0 bndstx [rcx+rax], bnd0
の3通りある(NASMはどれも通す). IntelのMPXスライドとsdeの逆アセンブル表記法も異なってたりする.
『タイムマシンでは、行けない明日』(畑野智美)
過去を変えたいために昔に行くがどうもうまくいかずにすれ違いばかり起こってしまう. 題材としてはよくあるけどなかなかおもしろかった.
『ふたつの星とタイムマシン』(畑野智美)は短編集だったが, それらの別々にあったエピソードをうまいこと一つにした感じ.
古いニコリ
こないだ実家に戻って自分の本の整理をしていたら1994年ごろのニコリが出てきた. 解いてない問題が多かったので持って帰ってやってみると中級者向けの問題でも難しい.
今のやつはやさしくしてるのね(その代わり後ろに巨大なのが増えている).
万年初心者なので手頃でありがたい.
multi byte nop
pull reqで教えてもらったのだがmulti byte nopは9byteまではIntelとAMDで同じらしい. 大昔に調べたときはなんか微妙に違っていた気がして(勘違いかな?)それっきり放置だったのだが, 同じなら対応してよいな.
Software Optimization Guide for AMD Family 17h ProcessorsのEncoding Padding for Loop Alignmentをみると10byteから15byteまでは66hプレフィクスを繰り返してる. 命令デコーダの負荷が高くなったりしないのだろうか(まあマニュアルにかいてるのだからAMDでは大丈夫なのだろうけど).
丸めモードを変更せずに0への丸めを実現する
ブクマにつっこみが入っていた
丸めモードを変更・に依存せずに0切り捨てを行う手法は遅くとも1997年には存在したのでいちいちいじってたらそれは処理系がうんk
指摘された99年頃のIntelの最適化マニュアルを発掘してみると確かにそう書いてますね. ありがとうございます. でもVCは2001年ぐらいのときは切り替えていたような(自信なし). Intelコンパイラはちゃんとやっていたのかな.
Pentium4から丸め制御(+α)だけ変更するときはFCWの変更が高速化されたので, その手法よりは切り替える方が速かったんじゃないかしら(自信なし).
現在のマニュアルには「丸め, 精度, 無限大ビットを3個以上の値の間で変更するときは丸めモードの変更を避けるアルゴリズムの方が効率がよい」とありますね. そこまで変更しないなら丸めモードを変更して丸めるほうがよいのでしょう(未確認).
_mm_cvt_roundsd_i64(__m128d, int r)のrの設定値
丸めモードRN, RD, RU, RZに対応して0~3の値を設定してもエラーになる(incorrect rounding operand).
何が悪いのかなあとコンパイルオプションを変えたり, 最新版gccをとってきてbuildして試してもエラー.
バグ報告してみるかとgcc.gnu.orgのbugzillaに書き込もうとしたらサーバーエラー.
で, clangでも同じエラーだし何か自分が悪いのかもともう一度確認して_MM_FROUND_NO_EXC(8)とorをとらないといけないことが分かった.
どこかマニュアルに書いてあるのかな. まあともかくすんでのところでバグ報告して恥かかずにすんでよかった.
書いてみた. AVX-512でのはなしはあまり知られていないと思う. gcc/clang/NASMで動作確認できず, Xbyak+sdeでしか試してないのであってるかとても不安だ.
『巨大数論』(フィッシュ)
『寿司 虚空編』(小林銅蟲)というよく分からないマンガ(タイトルは寿司なのに中身は数学)からたどり着いた.
まだ最初の方しか見てないけどおもしろそう. 先日読んだ『巨大数』より詳しそう.
cgo on Linux and macOS
どうもmacOSは挙動が微妙に違うようでいろいろ困った.
もうちょっとうまい方法がありそうだけどとりあえず両方で動くようになった.
頭痛
ひどい.
_mm_cvt_roundsd_i32
マニュアルやgcc/clangのライブラリヘッダを見る限りでは第二引数に0~3を指定できるように見えるのだけど指定するとエラーになってしまう. NASMでは
cvtsd2si eax, xmm0, {rz-sae}
みたいに書いても無視されるようだ(バグ?). Xbyakではちゃんと動いてるようだが不安.
SHA命令とMPX命令
Xbyakにpull reqが来ていたのでチェックしながら対応する.
『コンピュータは数学者になれるのか?』(照井一成)
めちゃくちゃ面白かった.
購入したのは1年以上前なのだけど, 少し読んでは挫折してを繰り返してなんとか最後までたどりついた.
真理述語の定義不能性と定義可能性, 超限順序数, 対角線論法を使ってはP≠NPを示せなさそうとか, CPS変換と二重否定のはなしとか, 断片的にしか聞きかじっただけだった言葉や概念を多少なりともわかった気分になった(もちろん詳細はまだ全然理解できてないけど).
また読み直そう.
『電王』(高嶋哲夫)
将棋の名人を目指す子供とコンピュータ用ソフトを開発する人の話.
テーマはよいのだけど, 話題が散漫で肝心の人工知能に関する記述やソフト開発のくだりが???なところが目立った.
『はじめて読む486』(蒲地輝尚)
ラボユースで見たいという人がいたので実家の押し入れから発掘した. 購入したのは20年以上前か.
本当は古い本を処分するはずが読んで詰め直しただけで終わってしまった.
Re: 割り算
メインではほとんど使われないので安全側に倒して実装しなおしてやっと動いた. 最適化は必要になってから. ペアリングでベンチマークをとるとChromeよりFirefoxの方が1割近く速いようだ.
割り算
vint.hppの除算が特別な値のときにエラー(?)になることがわかった. 割り算難しい.