憂鬱な午後のひととき

2月26日_

VMware上でubuntu 16.04-4-112から116にしたら遅くなったけど解決した顛末

一言でいうと112から116にするときはVMwareを再起動すること.

試した私の環境はCore i7-7700, Windows 10 Pro, DELL OptiPlex 7050, VMware 12.5.9.

経緯 : ubuntuのkernelのバージョンを112から116にしたらmclのpairing演算に掛かるサイクル数が 1.03Mclkから2.8Mclkと2.7倍以上も遅くなった(同一バイナリ). これは困った.

別のシステムだけどVMwareなしのリアルLinux + Haswellだとその現象は発生しなかった. pairingが遅くなっているマシンでループ内で加算する単純プログラムをテストしたらそれは遅くならなかった.

理由は分からないけどSpectreとMeltdown対策しか原因は思い当たらないのでいろいろオプションを換えて試す. 116起動時にspectre_v2=offを与えると遅くならないことが分かった.

twitterで教えてもらったIBRSまわりをいじる案(/proc/sys/kernel/ibrs_enabled see ubuntu MitigationControls)のは元々dmesgでDefaulting IBRS to disabledと表示されていたので影響はなかった.

まあどこかで対策されるまでしばらくspectre_v2=offで使うしかないのかなと思ったが, Windowsを再起動してテストすると速度低下しない!

いろいろ再起動してテストしても変わらず. これはなんかたまたま遅くなっちゃったけどごめん, 再現しなくなった案件かと思った.

が, 一度や二度の現象じゃなかったのでもう一度遅くならないかもうちょっとがんばる. で, なんとか再現.

どうやら新規にVMwareを起動し112 kernelを起動してから仮想マシン内でrebootして116を再起動すると発現することが分かった. 仮想マシンでshutdownしてVMwareを起動し直して116を動かすと発現しない.

112 kernelじゃなくて116 + spectre_v2=offでも同様. つまり

VMware起動 → 112(or 116 + spectre_v2=off)のkernel起動 → reboot → 116 + spectre_v2=onのkernel起動は速度低下
VMware起動 → 116 + spectre_v2=onのkernel起動は大丈夫

のようだ. VMware内部で仮想マシン起動時になんらかのspectre対策チェックが必要か調べて設定し, その設定は仮想マシンrebootでは引き継がれ, それが対策ありkernelと干渉してるのだろうと推測.

ちなみにこの速度低下が発生している状態で, 上で単純ループでは遅くならなかったと書いたが間接ジャンプやcallを呼ぶタイプだと遅くなった.

// inline版
int main(int argc, char *[])
{
    long x[2] = { argc, argc };
    long y[2] = { argc, argc };
    for (int i = argc; i < 1000000000; i++) {
        x[0] += x[1] + y[0];
        x[1] += y[1] + x[0];
    }
    printf("%ld %ld\n", x[0], x[1]);
}

// call版
void add(long *x, const long *y)
{
    x[0] += x[1] + y[0];
    x[1] += y[1] + x[0];
}

    // mainのループだけ下記に変更
    for (int i = argc; i < 1000000000; i++) {
        add(x, y);
    }

// 間接call版
void (*f)(long *x, const long *y);
    if (argc) f = add;
    for (int i = argc; i < 1000000000; i++) {
        f(x, y);
    }

最適化がかからないようにg++ -O1でコンパイル.

ループ時間[time]
inline版 call版 間接call版
通常 0.972 1.712 1.948
速度低下時 0.976 3.700 9.500
低下比率 1.00 2.16 4.88

inline版は遅くなってないけどcall版は遅く, 間接call版はより遅くなっていた.

まとめ : VMware 12.5.9でLinuxのSpectre対策kernelにupdateするときはVMwareを再起動したほうがよい.

追記 : 可能性としてはリアルマシンでもsoft rebootで同様の現象になるかは確認しないといけないな.
別CPUのリアルマシンで試したけど再現しなかった. やはりVMware特有の現象か.

2月21日_

x86/x64最適化勉強会8 レポート

書いた.

2月19日_

集約署名

なんかリクエストがあったので実装してみた. 複数の異なる平文と秘密鍵で作った署名を一つにまとめ, それを複数の公開鍵を使って検証できる方式のやつ(Aggregate and Verifiably Encrypted Signatures from Bilinear Maps).

2月17日_

x86/x64最適化勉強会8

無事盛況に終わりました.

細かい話はまた別途書くとして, 私の前座のAVX-512の解説に始まり@kaityo256さんのAVX-512を使ったリアルな最適化の話, 毎度おなじみ皆勤の@tanakmuraさんの命令のスループットを測るパズルチックな話, 旬の話題のMeltdown, Spectreで本職の@satoru_takeuchiさん, @mhiramatさんによる詳細な解説と質疑応答. 非常に勉強になりました.

私的な勉強会ではありますが, 今回は初めて本社の有志の人に運営を手伝っていただきました. @makotokagaさんがスーツケースいっぱいのすごい機材を持ち込んで撮影, 配信してくださいました(動画). 冒頭切れてしまってるのは弊社が提供していたネットワークの問題です(HDMIも不調でした. 調べます).

さくらインターネット社がフードスポンサーになってくださったので同じ会場で懇親会もできました.

みなさま, どうもありがとうございました. 開催はめちゃくちゃ時間と精神ポイントが削がれるのでなかなか辛いものがありますが, またやりたいですね.

2月16日_

いろいろ

やることが多くて有給と在宅勤務と休みの区別が限りなく小さい.

2月14日_

ebisu_feature.cpp vol.5

C++17標準ライブラリに入った並列プログラミングの紹介をした(parallel.md).

2月13日_

clang 3.9以前

const struct X {} x;

コンパイルエラーになると教えてもらった. へえ, 全然気がつかなかった.

【暗号通貨輪読会#15】Enigma参加. 五反田初めてで案の定迷う. MPCとFHEを使ったenigumaで期待してたけどちょっと消化不足な発表だった.

2月12日_

CPUのキャッシュサイズ取得

mkl-dnnにXbyakのパッチが入ってたのを欲しいと言ったら, pull reqしてくれた. ライセンスが自分の物になるのでありがたい.

2月11日_

最適化勉強会用資料準備

会場準備などでどたばたしそうなので早めに準備しとく.

2月10日_

AVX-512

使える命令群がCPUによって異なりすぎて実際に使えるものなのかさっぱり分からん. 「これよさそう」と思っても「次の次のCPUで使える命令」だったりするし.

2月9日_

ビデオカメラ

youtubeの配信をテストしてみたけど会社のビデオカメラは対応してなかった. あてが外れた. iPhoneとかのほうがきれいにできるのかな. でもマイクつなげられない. 変換ケーブルは何がいるのだろう(機械音痴).

2月7日_

最適化勉強会タイムテーブル

ありがたいことに多数の応募があるけどあふれてるのでキャンセルの人は早めにお願いします.

2月6日_

SHEのゼロ知識証明API

ElGamal暗号の平文mを0か1のどちらかであることを検証できるAPIを追加した.

2月5日_

mclの乱数生成設定API

いろいろ試して外から設定できるAPIを追加した. wasmではこれを使えばfs周り(/dev/urandom/エミュレーションで使ってた)は除去できるだろうか.

2月4日_

Re: 体調不良

多少喉は痛いがぎりぎりセーフな感じ. 勉強会欠席はしゃれにならないので気を付ける.

2月3日_

体調不良

ちょっとしんどい. インフルエンザにかかってないといいのだけど.

2月2日_

ナノサイズのフラスコを創ってみよう!

第91回 京都大学丸の内セミナー. すっごい面白かった. C60やC70に穴を空けて水分子1個だけ入れて蓋をするらしい. 講演が終わったからの質問もたくさんあっていろいろ勉強になった.

2月1日_

ebisu_feature.cpp vol.4

C++17勉強会. 今回は私が適当に概略を説明した. みなさんよく調べてるなあ.


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