数学の勉強会はほんと久しぶりなのでかなり緊張した.
資料は用意したけどホワイトボードにひたすら書くスタイルで. スライドをめくってるだけだと速すぎて計算が終えなくて自分でも何やってるか分からなくなってしまう.
面倒でも一つ一つ書いていく方がいいね.
数学の勉強会はほんと久しぶりなのでかなり緊張した.
資料は用意したけどホワイトボードにひたすら書くスタイルで. スライドをめくってるだけだと速すぎて計算が終えなくて自分でも何やってるか分からなくなってしまう.
面倒でも一つ一つ書いていく方がいいね.
社内のGoの勉強会に参加
@ymmt2005さんによる資料More Effective Go.
打ち合わせ
長かった.
Windows 10へのアップグレード
もうすぐ無料アップグレード期間が終わるので3度目のトライ. やはり電源まわりがおかしくなる. 高速スタートアップを無効にしたりデバイスドライバで古いのが残ってないか探したけどうまくいかない.
サスペンドや休止はできるようになったがすぐ電源が入ってしまう.
いろいろ見ていてようやくわかった. [デバイスマネージャー]→[ネットワークアダプター]→[プロパティ]→[電源の管理] で「このデバイスでコンピュータのスタンバイ状態を解除できるようにする」をoffにしたら大丈夫になった. BIOSでそのあたりの設定は切っていたけどこちらも切らないといけなかったようだ.
これで手持ちのマシンは全てWindows 10になった. 次, 移行しないといけないのはここのホームページだな.
残りあと数個となったところでm128/m256/m512を区別しないといけない命令vfpclasspd/psがあった. 仕方がないのでxword/yword/zwordを追加する. NASMだとxwordじゃなくてowordだしMASM系だとxmmword ptrとかだしややこしい. とりあえず全部命令をつっこんだ. リファクタリングをしたらmasterブランチにしよう.
AVX-512残りあと100個ぐらい
ようやく果てしない作業が終わりそうだ. AVX2とAVX-512のファイルヘッダはわけない方がよかったかな. 作業が煩雑になってしまった.
gather系終わり
AVX2のときはXMMレジスタでマスクを指定していた部分がマスクレジスタを使うようになってる. これで機能拡張系は一通りすんだ. あとはAVX-512専用命令の追加(でも道半ば). 早くこの不毛な作業を終わらせたい.
にしてもNASMのバグ率低い. 今まで新命令実装してるときは2, 3個は必ず見つけていたのに今のところ明確なバグは見当たらない.
cvt系命令終わり
実装終わった. コード整理はあとで. たとえば
vcvtpd2dq ymm2{k3}{z}, zmm20, {rd-sae}をNASMでアセンブルしたコード62B1FFBBE6D4をIntelのツールxedで逆アセンブルすると
vcvtpd2dq ymm2{k3}{z}{rd-sae}, zmm20
になるので{}の順序はどこでもいいようにした.
cvt系命令
数が多い上, それぞれ微妙に違っていてパターン化しにくいのが辛い. 引数の順序がIntelのアセンブラ(?)とNASMで違うのもあるようだ. ,{sae}という形は構文として筋が悪すぎだ.
Re: 圧縮displacement
一通り書き直した. 手作業じゃなく機械的にやりたいがPDFからテキスト抽出してもフォーマットができてないのでちょっと難しい.
圧縮displacement
これはbroadcastのときのみ使うのかと勘違いしていたが全てのメモリアクセスでサポートしないといけないのだった. しかも値が命令やinputSizeによって一つ一つ変わるので命令ごとに指定しないといけない.
命令表のT2やT4を見てもサイズまで確定しないと値が分からない. 今まで追加していて全部の命令の設定にフラグを設定しないといけない. めちゃくちゃ辛い.
vcvtpd2dq
AVXの時点でvcvtpd2dq xmm, m128とvcvtpd2dq xmm, m256は区別できたのか. 気がついてなかった. NASMで前者は[rax]. 後者はyword [rax]. 前者はxword [rax]とできるのかと思ったらoword [rax]だった.
Xbyakではywordとbroadcast用のyword_bのみを追加するか.
集中豪雨
出かけた途端, 強烈な雨でずぶ濡れになった. 靴もちゃぽんちゃぽんとなって, 服来たままお風呂にはいった状態. 諦めて一度家に戻る.
シャワーを浴びて一息入れたら復活したので渋谷に出かける. 久しぶりに大学の友達に会う.
みなは私が遅れている理由を「迷子になったか」「時間を間違えたか」と予想していたが答えは「今日が7/14と思ってなかった」でした.
AVX-512
ひたすら心折れないように命令追加中.
横浜国立大学
初めて. バスの本数が少なくて苦労した. 森の中みたいで散歩するのは気持ちよさそう.
768bitまでの素数に対応してほしいという依頼があったのでサポート. このサイズになってくるとMontgomeryは乗算が終わってからの方がよさげな気がする.
新人研修
今年の本社の新人研修はかなり気合が入ってる. 講義もたくさん. 私も少し担当になったので準備中.
自分のはひどい発表だったが他の方のはとても勉強になった(From IA-32 to AVX-512).
振り返り問題:
数値一つは64bitとしてzmm0=[8:7:6:5:4:3:2:1], *rax = [Y:X], rax = [H:L]のとき次の命令の挙動の結果を答えなさい.
movsdとか相当ややこしい.
命令 | 意味 | 結果(範囲指定で反転) |
---|---|---|
mov al, al | alをraxの下位8bitに移動 | rax=[H:L] |
mov ax, ax | axをraxの下位16bitに移動 | rax=[H:L] |
mov eax, eax | eaxをraxの下位32bitに移動 | rax=[0:L] |
movsd xmm0, xmm0 | 最下位doubleを移動 | zmm0=[8:7:6:5:4:3:2:1] |
movsd xmm0, [rax] | 最下位doubleを移動 | zmm0=[8:7:6:5:4:3:0:1] |
vmovsd xmm0, xmm0, xmm0 | 最下位doubleを移動 | zmm0=[0:0:0:0:0:0:2:1] |
vmovsd xmm0, [rax] | 最下位doubleを移動 | zmm0=[0:0:0:0:0:0:0:1] |
movlpd xmm0, [rax] | double x 2を移動 | zmm0=[8:7:6:5:4:3:2:1] |
vmovlpd xmm0, xmm0, [rax] | double x 2を移動 | zmm0=[0:0:0:0:0:0:2:1] |
addsd xmm0, xmm0 | 最下位doubleを加算 | zmm0=[8:7:6:5:4:3:2:2] |
addpd xmm0, xmm0 | double x 2を加算 | zmm0=[8:7:6:5:4:3:4:2] |
vaddsd xmm0, xmm0, xmm0 | 最下位doubleを加算 | zmm0=[0:0:0:0:0:0:2:2] |
vaddpd xmm0, xmm0, xmm0 | double x 2を加算 | zmm0=[0:0:0:0:0:0:4:2] |
vaddpd ymm0, ymm0, ymm0 | double x 4を加算 | zmm0=[0:0:0:0:8:6:4:2] |
Microsoft MVP
Visual Studio and Development Technologies部門でいただけた. ありがたい.