
プログラミング入門コースの講師は、学生がプログラムエラーの理由を見つけることを知っています。 ソート手順でデータの半分が拒否されましたか? 「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 .
?
? , Skylake. 4 8 , HT. ( ), . ,
,
— , .
, , .
,
. 4, HT, .
. 8 , .
.
, 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
. .
- 12 , 19 , , « , , Intel Skylake».
- (Hyper-Threading).
- , Hyper-Threading.
- , OCaml
gcc -O2
, gcc -O1
. , OCaml OCaml 4.02, gcc -O1
. - :
, gcc -O2
OCaml 4.03 , (- ) Skylake Hyper-Threading? , . , Hyper-Threading Skylake ()
- Intel .
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
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 — . .].