인텔.. 맛이 갔네요.
2017.06.26 10:30

카비레이크, 스카이레이크 CPU에서 하이퍼쓰레딩 사용 시
AH, BH, CH, DH 레지스터가 오염될 수 있고,
그로 인해서 EAX, EBX, ECX, EDX 및 RAX, RBX, RCX, RDX 레지스터가 오염될 수 있다는 오류입니다.
관련 분야 종사하는 분 께서는 여기까지 들으셨을때
"인텔이 갈때까지 갔구나." 라고 하실겁니다.
위의 네 개 레지스터는 인텔 CPU가 사용하는 가장 범용적인 레지스터 (GPR: General Purpose Register)입니다.
그 중에서도 8비트 서브셋이라서, 상위 32비트나 64비트 레지스터에 영향을 줍니다.
저 레지스터가 오염된다는 것은 CPU가 제대로 동작할 생각이 없다는 겁니다.
완전히 맛이 갔습니다.
편미분 중적분 하는데 덧셈을 못 한다는 의미입니다.
클리앙에서는 "저 레지스터가 잘 사용되지 않는 레지스터라 걱정할 필요가 없다"고 하는데
당장 IDA64로 PE파일 하나만 떠 봐도 수두룩하게 나오는게 해당 레지스터입니다.
문제 없다는건 말도 안되는 소리이고요.
정말 문제가 없었다면 이런게 화자될 리가 없습니다.
에러타 보면 Short Loop에서 AH, BH, CH, DH 쓰는게 문제라 나와있죠?
Short Loop에서는 AH, BH, CH, DH같은 8비트 레지스터 많이 씁니다. 용도가 그렇습니다.
클리앙 댓글의 요즘 컴파일러가 저 레지스터를 안 쓴다는 말도 잘못됐습니다.
PE든 ELF든 디스어셈블하면 8비트 레지스터 여전히 많이 쓰고,
저 버그를 발견한 사람이 OCaml 개발자입니다. OCaml은 그 자체가 컴파일러예요.
컴파일러 만드는 사람이 저 기능 동작시 오류를 발견해서 6개월간 원인을 찾다 나온 결과입니다.
제가 클리앙 아이디가 없어서 뭐라 적질 못하네요. 눈팅만 합니다.
ubuntu 16.04의 gcc만 봐도 여전히 8비트 레지스터를 사용합니다.
클리앙 그 분의 말 처럼 '최신 컴파일러는 8비트 레지스터를 사용하지 않는다'라면
왜 gcc (GNU C Compiler)는 8비트 레지스터를 쓰고 있을까요?
클리앙 댓글은 완전히 잘못된 주장입니다.
저 코드를 보면 이번 버그가 얼마나 심각한지 바로 알 수 있지요.
저 코드에서 AH 레지스터가 오염되면 엉뚱한 코드로 컴파일되는겁니다.
헤결방법은 현재로선 하이퍼쓰레딩을 끄는게 가장 확실한데요,
인텔 CPU에서 하이퍼쓰레딩을 끄면 남는게 뭐지요?
맛이 갈때까지 간겁니다.
제한적으로 모델 78 또는 93의 스테핑 3 스카이레이크는 마이크로코드 업데이트로 패치 가능한데
성능저하 수반하리라 예상합니다.
메인보드의 BIOS 업데이트로도 반영이 될 수 있는데
메인보드 제조사 지원이 없으면 이마저도 안됩니다.
BIOS 업데이트 해도 원 성능은 안 나옵니다.
인텔이 내년도, 내후년도쯤엔 삼성에게 공정이 밀린다는 소문이 돕니다.
팹에 투자할 현금이 없다는게 주요 원인이라는데요..
인텔 뭔가 심상치가 않아요.
코멘트 6
-
해색주
06.26 13:15
-
바보준용군
06.26 13:17
흠 저의 3470 의 수명연장에 도움되는 글이네요 ㅡ..ㅡ
격하게 학대 시켜서 한 3년 울궈먹어줘야겠습니다 -
즐거운하루
06.26 13:39
6세대 7세대 cpu 얘기군요
전 아직 듀얼과 1세대 사용하니 상관없는 얘기?
준용군님처럼 망가질때까지 노인학대 해보렵니다 ㅎㅎ -
사드사랑
06.26 23:37
옛날에도 있던 버그가 아닐까 의심해 봅니다. ㄷㄷㄷ 옛날 인텔이 나눗셈 오류났을때 생각이 납니다만 그것보다 훨씬 더 심각한 문제인듯 합니다.
팹에 투자할 현금이 없으면 파운드리 쓰면 됩니다. 삼성에서 만들어도 되고 tsmc에서 만들어도 됩니다. 인텔이 현금이 부족하려면 아직 몇 세대는 더 삽질을 해야 할 겁니다만.
구글해보니 온갖 자세한 진단/추측이 난무하는데, 많은 분들 얘기는 패치가 소프트웨어 수준에서 제공되는데 BIOS에서 올라와야 한다. 성능 악화는 그리 크지 않을 거다. 그리고 다음 세대에서 패치도 쉽게 될 듯 합니다. 다만 이 바닥에서 패치 한번에 돈이 엄청 깨진다는 점. (하드웨어 패치) 또 인텔이 많이 팔아먹는 서버마켙에 씨퓨 갈아줘야 하는 사태가 발생한다면 재밌는 게임이 될 수 있을 겁니다. 옛날 나눗셈 오류때도 문제 생기는 칩만 개별 교환해준 적이 있었다죠.
왜 지금 이런 문제가 불거지냐 (인텔 머했냐) 뭐 그런 얘기도 있네요. 대항마가 없을땐 가만히 있다가 대항마가 나오니까 터뜨린지도 모르겠습니다. 제 리눅스에서 똑같은 명령어를 수행해보면 3라인이 나오는데 들어가 보면 문제가 되는 short loop의 경우는 아닌 듯 합니다. 즉 단순히 ah 레지스터를 쓰느냐만 가지고 지금 흔한 문제다 라고 얘기하기는 쉽지 않습니다.
그렇지만, 하필 지금 인텔에 악재가 터져서 저랑 아무 상관없는 AMD가 어부지리를 얻고 있느냐에 대해서는 아자.. ( '')
-
SYLPHY
06.27 20:47
버그가 왜 생겼는지 아주 제한적으로 추정해 보면, 스카이레이크에서 11년만에 프론트엔드를 늘렸습니다.
11년 전은 인텔이 AMD와의 성능 경쟁에서 겨우 이기기 시작한 시기인데요, Conroe와 함께 프론트엔드를 늘렸습니다.
다만 이 시기에서도 완벽하지는 않았습니다. Conroe의 errata만 봐도 상당히 많았고 (그래도 이번 건 보다는 약해 보입니다.)
Conroe 개발 하던 도중에 AMD64 명령어가 생겨서 호환성을 맞추느라 아키텍처가 누더기가 됐다는 말이 있습니다.
당시만 해도 인텔은 64비트로의 전환을 당장 염두해 두지 않았다고 하고요.
그래서 Conroe는 64비트 모드로 동작하면 분기예측 성능이 엉망이 됩니다.
이건 이후의 울프데일 정도는 돼야 개선이 되구요.
프론트엔드 늘리는게 워낙 힘든 작업에다가 x86은 잘 아시듯 누더기 중에서도 심각한 누더기 아키텍처입니다.
CISC인데 내부적으로는 RISC로 동작하면서도 SIMD는 어마어마하게 많고 8비트부터 64비트까지 호환성을 다 가져가야 합니다.
물론 64비트로 오면서 8비트 호환성을 상당히 포기하긴 했으나, 칩셋 자체는 32비트를 지원하기 때문에 32비트 모드로 동작하는 경우에는 여전히 8비트 호환성을 가져가야 하는 상황이고요.
x86 자체가 레지스터 갯수가 너무 적어 성능이 느릴 수 밖에 없어서 Logical Register 하나를 두고 내부적으로는 Physical Register를 어마어마하게 많이 둔다고 알려져 있습니다. x86 명령어가 느리지만 동작은 빠른 이유가 이 때문이라고 보이고요.
문제는 어떤 Physical Register가 어떤 Logical Register와 매치되는지를 매번 결정해 줘야 하는데, 이걸 생으로 연산하기에는 너무 부담이 커서 캐싱을 해서 동작합니다. 예를 들어, Basic Block 정도의 단위에서는 그냥 생으로 연산해 버리는 식으로요.
이걸 매 경우마다 다 따져가며 연산해 줘야 하는데, 사람이 할 일이 아니지만.. 그래도 인텔은 하더라구요.
그런데 여기에 하이퍼쓰레딩까지 들어가 있으니까..... 이건 진짜 사람이 할 일이 아니게 됩니다.
이 어마어마한 아키텍처를 지금까지 끌고온 것도 대단한데......
AMD가 여기까지 따라온것도 신기합니다.
이야기가 조금 샜는데, errata를 보면 하이퍼쓰레딩이 켜진 상태에서 AH, BH, CH, DH레지스터가 Short Loop에서 사용될 경우, 루프 길이가 64 인스트럭션 이하일 경우에 문제가 생긴다고 합니다.
64인스트럭션이면, 짐작 가는게 있죠. 명령어 레지스터 캐시 크기가 비슷합니다...
64 인스트럭션을 넘어가면 캐시가 비워지니까 제대로 동작하는 것 같아요. 한방에 다 캐싱을 못하니까요.
그런데 64인스트럭션 자체가 일반적인 short loop의 한계를 넘어서기 쉬우니까
아마 이 조건을 만족하려면 아주 단순한 명령어로 구성된 short loop이어야 할 것 같아요.
하이퍼쓰레딩이 켜질 경우에만 문제가 생긴다는건 Logical Register와 Physical Register의 스위칭이 잘 안 일어난 것 같습니다.
프론트엔드는 바꼈는데 캐시 버퍼 비워주는 조건을 다 손보지 못해서 그런 것 같아요.
그래서 잘못된 레지스터가 파이프라인에 들어가면 뭐.. 오염되는거죠.
문제는 그게 AH, BH, CH, DH라는거고, 이게 오염되면 덧셈 뺄셈 곱셈 나눗셈 틀리고 함수 리턴 주소 바뀌고 난리가 나겠네요...
(왜 하필이면 이렇게 중요한 레지스터에서 오류가 생기는건지..)
문제가 왜 잡히지 않았나 생각해 보면
11년만에 프론트엔드를 바꿨고, 거기에 백엔드도 바꿨는데...
링버스 스마트캐시 구조 바꾸느라 그것도 힘들었을텐데
(샌디브릿지, 아이비브릿지는 L2 캐시가 심각하게 느려지는 버그가 있습니다. 캐시 내부의 버스 통신 비용(communication cost)이 캐시 전송 데이터보다 많아지는 경우가 드물지 않게 발생합니다....;;;; 이때 이미 인텔은 망조를 보이기 시작했습니다.. 아무튼 이 문제때문에 스카이레이크는 캐시 동작구조도 다시 설계했습니다. 정말 바뀐게 많은 아키텍처죠.)
과거에 사용했던 테스팅 노하우가 이번에는 안 통하는 시점이었던 것 같습니다.
문제는.. 저는 컴퓨터로 산술연산을 상당히 많이 하는데 (거의 연산만 돌립니다 ㅠㅠ)
스카이레이크 PC가 절대다수입니다.. 연산이 틀렸을 것 같아요.
하스웰에서 스카이레이크로 옮기고 나서 vector initialization이 좀 이상했었습니다.
이 연산이 전형적인 숏룹 쓰는 구문인데
10억개 정도의 데이터를 랜덤값 튀겨서 특정 범주 이내라면 값을 기록하도록 되어 있습니다.
이게.. 하스웰에서 스카이레이크로 옮기고 나서 값에 0이 훨씬 많이 들어와 있었습니다.
아무튼 저는 이게 상당히 심각해 보입니다.
인터넷에서는 실드가 정말 많이 보이고...
errata에 들어있는 흔하디 흔한 버그라는 사람도 있는데..
저는 개인적으로 errata를 종종 찾아보긴 합니다만, 이번과 같이 범용적인 케이스는 제 눈으로는 두 번째로 봅니다..
인텔 플로팅포인트 나눗셈 버그는 전해듣기만 한거라 제외하고,
AMD TLB 캐시 미스.. 이건 뭐..... 역대 최악의 양산 CPU 버그죠. CPU L3 캐시가 오염됩니다.
BIOS 패치로 TLB를 끄는 식으로 패치했고, "최소" 10% 성능이 낮아졌습니다.
이 시기부터 AMD가 맛이 가다가, 10년 넘어서야 다시 고개를 들고 있습니다.
그 다음으로 심각해 보이는게 지금 이 버그입니다.
GPR 중에서도 정말 메이저 레지스터인 AH, BH, CH, DH가 ALU에서 연산될 때의 버그....
x86에서 이 네 개의 레지스터를 빼면 시체인데 ㅠㅠ 여기서 버그라니.....
이런 버그는;;
산술연산 주로 돌리는 입장에서는 차라리 AMD를 쓰고싶어지는 수준입니다..... ㅠㅠ
-
42195m
06.27 18:08
딴 소리지만, 인텔에 위협이 다가오고 있다고 봅니다. 이건 마이크로소프트에게도 같이 다가오는 위협이고요.
PC가 컴퓨터 분야의 최대 지분의 위치에서 모바일 기기에 의해 밀려나며 모바일 CPU와 모바일 OS가 대세가 됐습니다.
이제 모바일 CPU로 윈도우, 리눅스도 돌릴 수 있게 되었고, 인텔 CPU에서 모바일 OS를 돌릴 수도 있습니다.
웹 서핑 환경은 터치 기능을 제대로 지원하지 않는 윈도우, 리눅스보다 터치를 지원하는 리눅스 커널에 기반한 OS가 더 편리해졌습니다.
모바일 기기의 CPU에서 인텔의 힘은 미미하며, 모바일 기기에서 오피스 포맷 호환 이외에는 윈도우를 쓸 필요가 없습니다.
자동차를 비롯해서 사물 인터넷 분야에서는 인텔과 마이크로소프트의 장점은 없고 단점만 존재합니다.
이대로 가면, 오피스 포맷 호환 문제도 별다른 장애가 되지 못하는 날이 옵니다.
그 전에 윈도우는 리눅스 커널로 바꾸고 터치 지원을 잘 하는 모바일 OS를 내놔 다른 모바일 OS에 경쟁해서 대등해져야 하고, 인텔은 모바일 CPU에서 x86을 버리고 암 진영 못지않게 성장해야 합니다.
20년도 더 전부터 계속 이 흐름입니다.
인텔, 마이크로소프트 두 회사는 20여 년 동안이나 이 흐름을 노력은 하였으나, 따라잡지 못했습니다.
앞으로도 그럴 거라고 봅니다.
x86아키텍처와 NT 커널, 오피스 포맷이 장점이자 단점입니다.
자본주의에선 많이 만들어 많이 파는 놈이 장땡입니다.
페라리보다 폭스바겐, 도요타가 시장을 움직입니다.
페라리가 10배 비싸게 팔고 마진율이 높더라도, 수많은 협력업체, 고용, 매출과 이익이 많은 대중차 브랜드가 세상을 바꾸는 거죠.
인텔과 마이크로소프트 진영이 각각 CPU와OS에서 만든 독점 구조가 모바일과 다양한 분야의 급성장으로 시장 규모가 뒤집히고 있죠.
PC보다 스마트폰의 댓수가 많고 교체 주기가 짧다는 건 시장 규모의 역전이고, 오래 전부터 예견되어 왔던 건데 두 회사는 최근 변화를 하고 있으나 늦었다고 봐요.
삼성과 CPU로 경쟁하는 분야는 없지 않나요? AMD가 요즘 새로운 CPU 내고 공격적으로 나오는 것 같던데, 인텔이 흔들린다는 평가를 들으니 기분이 묘하네요.