2017-10-09 5 views
2

원본 그림 (Memory Barriers: a Hardware View for Software Hackers)에서 해당 그림의 텍스트를 복사합니다.메모리 장벽 : 소프트웨어 해커를위한 하드웨어보기 예 3

표 4는 CPU 0, 1 및 2에서 동시에 실행되는 세 개의 코드 조각을 보여줍니다. 모든 변수는 초기에 0입니다.

3 번 줄에서 CPU 0이 "b"로 지정 될 때까지 CPU 1도 CPU 2도 5 번 줄로 진행할 수 없습니다. CPU 1과 2가 4 번 줄에서 메모리 장벽을 실행하면 둘 다 2 행의 메모리 배리어 앞에있는 CPU 0의 모든 배정을 볼 수 있습니다. 마찬가지로 8 행의 CPU 0의 메모리 장벽은 4 행의 CPU 1 및 2와 쌍을 이룹니다. 따라서 CPU 0은 줄의 "e"할당을 실행하지 않습니다 "a"에 대한 할당이 다른 CPU들 모두에게 보여 질 때까지 9. 따라서 9 번 줄에있는 CPU 2의 어설 션은 실행되지 않습니다. 나에게

enter image description here

은 CPU0에 선 6-9, 전혀 불필요한 보인다 CPU에 4 호선에 CPU 0 및 메모리 장벽에 대한 2 호선의 메모리 장벽 1 &이 보장 효과가 있기 때문에 b=1이 픽업되며, 이전 상점도 모두 a=1입니다. 그런 다음 assert e == 0 || a == 1이 항상 성공합니다.

내가 간과 한 것인지 모르겠다. 어떤 설명도 감사하겠습니다.

답변

0

CPU 0에서 6-9 행을 버리면 assert()가 실행되지 않습니다. 그런 다음 다시 e이 0으로 초기화되면 어설 션 이외의 모든 코드가 제거됩니다. 그러나 두 가지 수정 모두 도움이되지 않습니다. 대신 주장의 핵심은 "CPU 2가 실행 완료시 상태 e==1&&a==0을 볼 수 있습니까?"라는 질문입니다. 이 방법을 사용하면 어떤 순서로 어떤 값이 전달되는지에 대해 생각하게됩니다.

그러나 간과 한 주요 사항은이 종이가 상당히 오래되었다는 것입니다. 그 이후로 메모리 주문을 이해하고 형식화하는 데 많은 발전이있었습니다. 나는 새로운 메모리 주문 장을 Is Parallel Programming Hard, And, If So, What Can You Do About It?에 추가하는 중이다. 한편, LWN 기사 herehere 쌍이 도움이 될 수있다.

또는 책의 현재 상태를 보려면 git clone git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/perfbook.git.