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
13+epsilon00
24+epsilon13
46+epsilon1219
810+epsilon1723
1618+epsilon16



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

, , . N=1, N=2. 4, HT, . N=4. 8 , . N=8N=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 — . .].


Source: https://habr.com/ru/post/J332552/


All Articles