Intel Skylakeプロセッサーのバグを見つけた方法

プログラミング入門コースの講師は、学生がプログラムエラーの理由を見つけることを知っています。 ソート手順でデータの半分が拒否されましたか? 「Windowsでウイルスになる可能性があります!」バイナリ検索は機能しませんでしたか? 「今日のJavaコンパイラの動作は奇妙です!」経験豊富なプログラマーは、バグが通常自分のコードにあること、時にはサードパーティのライブラリにあること、非常にまれにシステムライブラリにあること、非常にまれにコンパイラにあり、プロセッサにはないことをよく知っています。 私も最近までそう思いました。 謎のOCamlクラッシュをデバッグしていたときにIntel Skylakeプロセッサのバグに遭遇するまで。



最初の症状



2016 OCaml 4.03.0 OCaml () : , OCaml OCaml 4.03.0, . , segfault, . , , Intel Skylake (Skylake — Intel. Kaby Lake).



25 OCaml, . Skylake? , Inria, Intel. ? I/O, , , segfault, .



, : ? ? , - GUI, . , , Hyper-Threading. HT Skylake AVX, HT (. ).



. (), CPU /, , OCaml. , , , . . - , , HT . ( , ).



OCaml, C, OCaml, . . OCaml 4.03, , 4.02.3. GCC, Clang. — Linux Windows, MacOS. MacOS Clang Windows- GCC, OCaml 4.03 GCC.



, : , OCaml 4.03 — , — - GCC , C . , GCC . , . .



, . GCC - , - . , , Address Space Layout Randomization (ASLR) — , . OCaml - , -. ASLR, , GDB.



2016 , , — Skylake. OCaml 4.03 ( ) OCaml. , . , GDB ( , ), OCaml, 1000 .



OCaml — , . 30 segfault , OCaml GC, . 50% mark_slice



OCaml. OCaml : , , Caml, Caml, ( ). 15 mark_slice



4.



, , mark_slice



. , . , OCaml !



, , : « !». , , , . OCaml N . OCaml, . , , :



N
1 3+epsilon 0 0
2 4+epsilon 1 3
4 6+epsilon 12 19
8 10+epsilon 17 23
16 18+epsilon 16






1000 . N=2 N=4? N? , Skylake. 4 8 , HT. ( ), . , 2+N+epsilon, N — , .



, , . N=1, N=2. 4, HT, . N=4. 8 , . N=8 N=16.



, Hyper-Threading, , , OCaml ( ) .



, , . HT . : .



? ! ? . , Intel - , , OCaml c Clang, « !». , , ( Intel -, ), , (, , ).





2016- , , (sky, , Skylake — ) - OCaml 4.03, ( ).



, 6 2017 Ahrefs ( OCaml, Caml ) OCaml 4.03.0: PR#7452 - Caml.



ocamlopt.opt , . , ocamlopt.opt OCaml, ocamlopt.byte, .



PR#7452 , , Ahrefs . .





5 , …





26 2017 "ygrek" «» Debian:



* New upstream microcode datafile 20170511 [...]

* Likely fix nightmare-level Skylake erratum SKL150. Fortunately,

either this erratum is very-low-hitting, or gcc/clang/icc/msvc

won't usually issue the affected opcode pattern and it ends up

being rare.

SKL150 - Short loops using both the AH/BH/CH/DH registers and

the corresponding wide register *may* result in unpredictable

system behavior. Requires both logical processors of the same

core (i.e. sibling hyperthreads) to be active to trigger, as

well as a "complex set of micro-architectural conditions"








SKL150 Intel 2017 65 Intel 6- . SKW144, SKX150, SKZ7 Skylake KBL095, KBW095 Kaby Lake. « » Intel, .



(« », !) : Hyper-Threading? ! ? ! , ? ! , , , Debian . , . Skylake ( Inria) , , 10 , 2,5 .



, SKL150 — . , , , GCC OCaml. , byterun/major_gc.c



sweep_slice



C:



hd = Hd_hp (hp);
/*...*/
Hd_hp (hp) = Whitehd_hd (hd);
      
      





:



hd = *hp;
/*...*/
*hp = hd & ~0x300;
      
      





Clang , :



movq    (%rbx), %rax
[...]
andq    $-769, %rax             # imm = 0xFFFFFFFFFFFFFCFF
movq    %rax, (%rbx)
      
      





GCC 8- %ah



8 15 %rax



, :



movq    (%rdi), %rax
[...]
andb    $252, %ah
movq    %rax, (%rdi)
      
      





. GCC , : 8- $252



, 32-, 64 , $-769



4 . , GCC %rax



, %ah



, , , , SKL150.



, , - . !





Intel Skylake Kaby Lake, . Debian , .



, OCaml . , Lwt, Coq Coccinelle.



, , Ars Technica, HotHardware, Tom's Hardware Hacker's News [ GeekTimes — . .].



All Articles