CPU 명령 실행 및 문제 [턴]

전송 : https://blog.csdn.net/lizhihaoweiwei/article/details/50562732

면책 조항 :이 문서는 블로거 원본입니다, BY-SA 저작권 계약, 원본 소스 링크이 문을 첨부 해주십시오되는 재생 CC 4.0을 따릅니다.
이 링크 : HTTPS : //blog.csdn.net/lizhihaoweiwei/article/details/50562732
"순서가 수행 할 수있는 CPU가있다"고이이 개념을 이해하는 약간의 실수가 있었다 주어진 공통 주제, 그것은 오늘 기사를 작성하는 것입니다 예약 메모. 여기에 참고 재정렬에만 CPU가 실행을 논의, 컴파일러는 스크램블 포함되지 않습니다.

왜 1.CPU는 순서가 될 것인가?
CPU 효율은 다음과 같은 명령이 실행을 시작 완료된 명령의 실행의 뒷면에 전면 행에 이르기까지 긴 시간이 소요되는 작업 "비동기"실행을위한 필수적인 이유입니다. 그러나 또한 백 엔드에서 명령 실행 후 오랜 시간이 소요되는 명령어의 상단 표면을 할 수 있습니다.

다음 두 문장의 CPU0 수행으로 :

A = 1;

B = 2;

CPU0 캐시에 캐시되지 않고, B 캐시에 캐시 CPU0이고 독점 상태 : B = 2의 경우에는 다음 우선 = 1 종료를 수행한다.

CPU를 기록 버퍼 ( "캐시 코 히어 런스"에서 도면) 다음의 변수를 처리하지 않는다 :

 

CPU0 그냥 캐시에서 = 1을 쓸 수 없습니다, 그것은 또한 CPU 캐시 위치를 알려줍니다 : 당신이 위의 캐시 만료 (무효화)를 CPU0 등 응답 (무효화 ACK), 쓸 수를받은 후!

이 통신 과정은 시간이 많이 걸리는이며, 시간의 ACK로부터받은 버스와 CPU1은 우선 순위가 높은 작업을 수행하는 등 방법 바쁜에 어떤 제한 불확실하다. B = 2, B와 (b 수정 된 상태가) 직접 b 값을 수정할 수 있습니다이 캐시 독점 상태에 있습니다 : CPU0이 대기 때문에 할 수 없어,이 후 지침을 계속 실행하고 싶습니다. 이 경우 B = 2 구현되었고, A = 1이 아직 완료되지! 타이밍에 관한에서이 순서를 벗어났습니다.

[기술은 확장]
변수의 일부 상호 캐시에 후 MESI 캐시 일관성 소정의 다른 타이밍 Xiachu 상태에서 CPU가 보장 할 수있는 일반적으로 사용되는 프로토콜, 및 동작 상태이다. 본 계약은 일관된 캐시를 보장하여 엄격히 준수. 이 문서에서는 좋은 MESI 설명


솔루션 순서가 2.CPU?
순서 밖으로 CPU가 실행은 다음과 같다 :

스크램블링 기록 (저장 가기), A는 = 1, B = 2 -------------> B = 2, A = 1;

두번째는 스크램블링 기록 (저장 하중) 읽어, 부하 (b) ------------> 부하 (b) A = 1 = 1;

3 차는 (부하 하중) 읽어, 하중 (B) -----------> 부하 (b) 하중 (a) 부하 (a);

네 판독 스크램블 (로드 저장) :.로드 (a) B = 2, ----> B = 2, 하중 (A); 

C에 의해 제공되는 메모리 모델 제약 ++ 다른 문서가 한 유연 같은 글로벌 순서, 부분 코드 시퀀스의 순서와 관련된 로직 등과 같은 서로 다른 강도의 실행 순서의 효과를 달성하는 데 필요한 메모리를 제한 할 수있다. 이것은 우리는이 두 제약 sfence 일반적인 읽기 및 쓰기 lfence 울타리 울타리를 사용,이 문서의 초점이 아니다. 먼저 현대 CPU 아키텍처를 준 :(이 그림은 "캐시 일관성")에서 유래 :

 

lfence : 부하 차단, 즉, 이렇게 응용 CPU 무효화 큐 때문에 캐시 실패, 다른 CPU의 데이터를 동기화하는 것이있다.

sfence : 저장소 울타리, 즉, 이렇게 응용 CPU 스토어 버퍼 것을 캐시 동기화.

하기 실시 예는 2 개 개의 메모리 배리어의 애플리케이션을 도시한다.

울타리를 사용하지 않고 메모리에서 :

CPU0 실행

A = 1;
B = 1;

CPU1 실행

(b = 1!) 동안;
어설 션 (a == 1);

CPU1의 어설 가능성이 실패 : 캐시가 CPU0에 위치하지 않는 한, (B)가 CPU1 캐시에 위치하지 않는 한.

CPU0이 CPU1 직후 수신이 메시지에 대한 응답으로, a의 값을 다시 작성하는 메시지를 보내 무효화 요구를 읽기 :이 무효화 큐하지만 실시간 CPU1에 무효화 ACK 메시지 및 추가하고이 메시지를 처리하지만, 정확한 시간까지 기다립니다 치료로 이동합니다.

CPU1가 B의 값을 얻을 수있는 메시지를 보낼 필요를 읽고,이 메시지가 B의 CPU0의 값이받은 후 즉시 응답입니다.

다음과 같이 실행 순서에 실패 결과 한 종류의 주장이다 :

 

1. CPU0 CPU1과 동시에 = 1 때 (b를! = 1)로 시작한다.

A = 1 CPU0는 메시지 판독 무효화를 보내는 스토어 버퍼를 쓴다

CPU1 전달 (원격) 판독 메시지

 

판독을 실행은 B = 2.CPU0 CPU1가 무효화 판독 메시지를 수신하고, 메시지 (1)를 수신한다.

캐시 라인의 CPU0 CPU1 직접 기입 : B = 1

가치가 무효 CPU1 나타내는 무효화 큐 마커의 CPU1, 무효화 ACK를 반환

 

3.CPU0 완성 상기 CPU 1 캐시 행한다에게 어설 = 0 (a == 1)을 픽업 실패

 

그들은 피하려면 두 가지를 보장 할 수있는 경우입니다 위의 실패에 대한 이유를 생각 :

그들이 무효화 큐에 갈 수있는 경우의 (a == 1) 지난 어설에서 1.CPU1는이 단계가 실패하지 않습니다, CPU0는 새 값을 요청 이동 무효 확인합니다.

시는 == 1 일 것임에 틀림 B == 1 : 요구 사항이 있는지 확인하는 것이 2. 또 다른 포인트. 이것은 == B == 1 이전에 1을 완성하기에 CPU0 효과의 구현을 필요로한다. 즉하는 == 1 == 1 B 다음 기록을 작성한다.

각각, 두 지점에 대해 상술 :로드 메모리 울타리 1 보장 될 수 있고, 메모리 저장 울타리 2를 보장 할 수있다.

로드 메모리 울타리 (lfence)을 수행 값이 실패한 경우 거래 무효화 큐는 다음 다시 요청합니다.

에 쓰기 바로이있는 경우, 새롭게 기록의 양이하지 않는 가게 버퍼 내부 라벨의 금액 : (저장 버퍼의 값에 디자인 기능을 저장하는 버퍼, 저장 버퍼 표시가 취급 : 저장 메모리 울타리 (sfence)는 일을했다 캐시 [캐시조차 량]이 있지만, 저장 버퍼에 기록되는, 양을 표시하지 않는다. 적절한시기까지 때 브러쉬 캐시에 스토어 버퍼 보장하기 위해 그 표지 제 쓰기 캐시의 양 마킹.이 끝난 후 기입 된 양)는 기록 순서에 달했다.

그래서 위의 문제는 해결 될 수있다 :


CPU0 실행

A = 1;

sfence (); // 기록이 있도록하고 물품 B
B = 1.;

CPU1 실행

(b = 1!) 동안;

lfence (); // 최신 보장의 가치를 얻을.
어설 션 (a == 1);

우리는 원칙과 sence의 실현 이후 (즉, 그들은 일을)의 lfence 것을 언급해야한다
sfence 가진 릴리스 의미 : 릴리스 코드는 이전 코드보다 전에 시작할 수 없습니다 뒤에. 이 의미는 sfence 작업이 동기로 작동하도록 강제하기 때문에 이유. 그것은 다음과 같은 지침을 계속하기 위해 완료해야합니다.

취득 불가 코드 앞에 나중에 코드보다 개시 후 : 획득 의미를 갖는 lfence. 같은 이유로 이유는 이유가 의미.

3.CPU 저장 단순 해석 모델은
CPU가 버퍼 무효화 큐를 저장할 이유 단순히 분석.

버퍼 저장할
더 스토어 버퍼가없는 경우, CPU는 양, 다음의 경우를 쓴다.

는 CPU (1)의 양이 캐시에 있지 판독 무효화 신호 요구를 발송하고,이 신호를 리턴한다 후 캐시에 재 기입 한 후 양을 기다린다.

양 상태의 배타적 인 경우 2. CPU 캐시의 양은 직접 변경한다. 그리고 그것은 다른 CPU가 변경 ​​후 이러한 변화를 인식 할 수있는 메시지를 보낼 필요성을 무효화 공유하는 경우.

이 경우, 다른 CPU와 통신 할 수있는 CPU를 트리거 할 가능성이 높습니다, 우리는 그들에게 회신을 기다릴 필요가있다. 이 클럭 사이클을 많이 낭비! 효율성을 개선하기 위해, 비동기 방식으로 처리하기 위해 사용될 수있다 : 응답 신호는 캐시에 적용 할 때까지, 버퍼에 제 1 값, 상기 통신의 다음의 송신 신호를 작성. 또한, 버퍼는 CPU의 독서를 받아 들일 수 있습니다. 이 버퍼는 버퍼에 저장된다. 명령의 일정 금액의 과제의 완료를 기다리지 않고,이 최적화 저장 전달이라고, 독서의 양 저장 버퍼에, 다음 명령어를 계속합니다.

큐 무효화는
, 수신 측이 무효화 신호를 수신 한 후 유사하게, 송신 신호의 활성 말단을 해결의 효율은 다음에, CPU는 (다른 값 CPU 동기화) 즉각적인 조치를 취할 경우, 다음의 클록 사이클이 너무 긴 응답 신호를 반환 또한 여기에 최적화 될 수있다. CPU는 수신단 대신 즉각적인 조치를 취하는 신호를 수신하지만, 바로 큐에 응답 신호를 무효화 할 후에. 따라서 치료, 무효화이 큐에 거래를 이동 오른쪽 때까지 기다립니다. 이 큐는 무효화 큐입니다.

 

참고 문헌
에 대한 심층적 인 자바 메모리 모델 
http://www.importnew.com/10589.html


심층 자바 메모리 모델의 이해 (4 개)
http://www.infoq.com/cn/articles/java-memory-model-4/


그는 Dengcheng
http://hedengcheng.com/

몇 가지 다른 울타리
http://www.cnblogs.com/catch/p/3803130.html

부하 획득을 놓고 배울 스토어
http://blog.csdn.net/summerhust/article/details/7406479

leveldb AotmicPointer 달성
http://brg-liuwei.github.io/tech/2014/10/15/leveldb-1.html

leveldb AotmicPointer实现2
http://huchh.com/2015/12/03/leveldb-atomicpointer/

스토어 버퍼 및 무효화
http://www.importnew.com/10589.html

C ++ 메모리 모델
http://blog.csdn.net/pongba/article/details/1659952

CPU 캐시 선집
http://blog.csdn.net/henzox/article/details/40427463

 

예 지시 재정렬

http://www.zgxue.com/164/1645056.html
----------------
면책 조항 :이 문서는 "lizhihaoweiwei의 원래 기사 CSDN 블로거는 CC 4.0 BY를 따라 -SA 저작권 계약, 원본 소스 링크이 문을 첨부 해주세요 재현.
원본 링크 : HTTPS : //blog.csdn.net/lizhihaoweiwei/article/details/50562732

추천

출처www.cnblogs.com/sky-heaven/p/11839244.html