diff options
author | SeongJae Park <sj38.park@gmail.com> | 2017-11-17 21:52:23 -0500 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2017-11-20 12:44:10 -0500 |
commit | 578152da87c7e9d350a5164beb16214e5bef1420 (patch) | |
tree | c1de0cfbea18c04045804fee423a2776cfc1c4cc /Documentation | |
parent | 8ee25f6fcfa967da26c5dfa43c731a61f84f7404 (diff) |
kokr/memory-barriers/txt: Replace uses of "transitive"
This commit applies two upstream change, commit f1ab25a30ce8
("memory-barriers: Replace uses of "transitive"") and commit 0902b1f44a72
("memory-barriers: Rework multicopy-atomicity section") to the Korean
translation. Those two changes are applied with this signle commit
because the second change is improvement of the first one.
Signed-off-by: SeongJae Park <sj38.park@gmail.com>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/translations/ko_KR/memory-barriers.txt | 176 |
1 files changed, 88 insertions, 88 deletions
diff --git a/Documentation/translations/ko_KR/memory-barriers.txt b/Documentation/translations/ko_KR/memory-barriers.txt index a7a813258013..7433ad60fabc 100644 --- a/Documentation/translations/ko_KR/memory-barriers.txt +++ b/Documentation/translations/ko_KR/memory-barriers.txt | |||
@@ -82,7 +82,7 @@ Documentation/memory-barriers.txt | |||
82 | - SMP 배리어 짝맞추기. | 82 | - SMP 배리어 짝맞추기. |
83 | - 메모리 배리어 시퀀스의 예. | 83 | - 메모리 배리어 시퀀스의 예. |
84 | - 읽기 메모리 배리어 vs 로드 예측. | 84 | - 읽기 메모리 배리어 vs 로드 예측. |
85 | - 행성 | 85 | - Multicopy . |
86 | 86 | ||
87 | (*) 명시적 커널 배리어. | 87 | (*) 명시적 커널 배리어. |
88 | 88 | ||
@@ -656,6 +656,11 @@ Documentation/RCU/rcu_dereference.txt 파일을 주의 깊게 읽어 주시기 | |||
656 | 해줍니다. | 656 | 해줍니다. |
657 | 657 | ||
658 | 658 | ||
659 | 데이터 의존성에 의해 제공되는 이 순서규칙은 이를 포함하고 있는 CPU 에 | ||
660 | 지역적임을 알아두시기 바랍니다. 더 많은 정보를 위해선 "Multicopy 원자성" | ||
661 | 섹션을 참고하세요. | ||
662 | |||
663 | |||
659 | 데이터 의존성 배리어는 매우 중요한데, 예를 들어 RCU 시스템에서 그렇습니다. | 664 | 데이터 의존성 배리어는 매우 중요한데, 예를 들어 RCU 시스템에서 그렇습니다. |
660 | include/linux/rcupdate.h 의 rcu_assign_pointer() 와 rcu_dereference() 를 | 665 | include/linux/rcupdate.h 의 rcu_assign_pointer() 와 rcu_dereference() 를 |
661 | 참고하세요. 여기서 데이터 의존성 배리어는 RCU 로 관리되는 포인터의 타겟을 현재 | 666 | 참고하세요. 여기서 데이터 의존성 배리어는 RCU 로 관리되는 포인터의 타겟을 현재 |
@@ -864,38 +869,10 @@ CPU 는 b 로부터의 로드 오퍼레이션이 a 로부터의 로드 오퍼레 | |||
864 | 주어진 if 문의 then 절과 else 절에게만 (그리고 이 두 절 내에서 호출되는 | 869 | 주어진 if 문의 then 절과 else 절에게만 (그리고 이 두 절 내에서 호출되는 |
865 | 함수들에게까지) 적용되지, 이 if 문을 뒤따르는 코드에는 적용되지 않습니다. | 870 | 함수들에게까지) 적용되지, 이 if 문을 뒤따르는 코드에는 적용되지 않습니다. |
866 | 871 | ||
867 | 마지막으로, 컨트롤 의존성은 이행성 (transitivity) 을 제공하지 -않습니다-. 이건 | ||
868 | 'x' 와 'y' 가 둘 다 0 이라는 초기값을 가졌다는 가정 하의 두개의 예제로 | ||
869 | 보이겠습니다: | ||
870 | |||
871 | CPU 0 CPU 1 | ||
872 | ======================= ======================= | ||
873 | r1 = READ_ONCE(x); r2 = READ_ONCE(y); | ||
874 | if (r1 > 0) if (r2 > 0) | ||
875 | WRITE_ONCE(y, 1); WRITE_ONCE(x, 1); | ||
876 | |||
877 | assert(!(r1 == 1 && r2 == 1)); | ||
878 | |||
879 | 이 두 CPU 예제에서 assert() 의 조건은 항상 참일 것입니다. 그리고, 만약 컨트롤 | ||
880 | 의존성이 이행성을 (실제로는 그러지 않지만) 보장한다면, 다음의 CPU 가 추가되어도 | ||
881 | 아래의 assert() 조건은 참이 될것입니다: | ||
882 | 872 | ||
883 | CPU 2 | 873 | 컨트롤 의존성에 의해 제공되는 이 순서규칙은 이를 포함하고 있는 CPU 에 |
884 | ===================== | 874 | 지역적입니다. 더 많은 정보를 위해선 "Multicopy 원자성" 섹션을 참고하세요. |
885 | WRITE_ONCE(x, 2); | ||
886 | 875 | ||
887 | assert(!(r1 == 2 && r2 == 1 && x == 2)); /* FAILS!!! */ | ||
888 | |||
889 | 하지만 컨트롤 의존성은 이행성을 제공하지 -않기- 때문에, 세개의 CPU 예제가 실행 | ||
890 | 완료된 후에 위의 assert() 의 조건은 거짓으로 평가될 수 있습니다. 세개의 CPU | ||
891 | 예제가 순서를 지키길 원한다면, CPU 0 와 CPU 1 코드의 로드와 스토어 사이, "if" | ||
892 | 문 바로 다음에 smp_mb()를 넣어야 합니다. 더 나아가서, 최초의 두 CPU 예제는 | ||
893 | 매우 위험하므로 사용되지 않아야 합니다. | ||
894 | |||
895 | 이 두개의 예제는 다음 논문: | ||
896 | http://www.cl.cam.ac.uk/users/pes20/ppc-supplemental/test6.pdf 와 | ||
897 | 이 사이트: https://www.cl.cam.ac.uk/~pes20/ppcmem/index.html 에 나온 LB 와 WWC | ||
898 | 리트머스 테스트입니다. | ||
899 | 876 | ||
900 | 요약하자면: | 877 | 요약하자면: |
901 | 878 | ||
@@ -930,8 +907,8 @@ http://www.cl.cam.ac.uk/users/pes20/ppc-supplemental/test6.pdf 와 | |||
930 | 907 | ||
931 | (*) 컨트롤 의존성은 보통 다른 타입의 배리어들과 짝을 맞춰 사용됩니다. | 908 | (*) 컨트롤 의존성은 보통 다른 타입의 배리어들과 짝을 맞춰 사용됩니다. |
932 | 909 | ||
933 | (*) 컨트롤 의존성은 행성을 제공하지 -않습니다-. 이행성이 필요하, | 910 | (*) 컨트롤 의존성은 multicopy 을 제공하지 -않습니다-. 모든 CPU |
934 | smp_mb() 를 사용하세요. | 911 | 특정 스토어를 동시에 보길 원한다면, smp_mb() 를 사용하세요. |
935 | 912 | ||
936 | (*) 컴파일러는 컨트롤 의존성을 이해하고 있지 않습니다. 따라서 컴파일러가 | 913 | (*) 컴파일러는 컨트롤 의존성을 이해하고 있지 않습니다. 따라서 컴파일러가 |
937 | 여러분의 코드를 망가뜨리지 않도록 하는건 여러분이 해야 하는 일입니다. | 914 | 여러분의 코드를 망가뜨리지 않도록 하는건 여러분이 해야 하는 일입니다. |
@@ -943,13 +920,14 @@ SMP 배리어 짝맞추기 | |||
943 | CPU 간 상호작용을 다룰 때에 일부 타입의 메모리 배리어는 항상 짝을 맞춰 | 920 | CPU 간 상호작용을 다룰 때에 일부 타입의 메모리 배리어는 항상 짝을 맞춰 |
944 | 사용되어야 합니다. 적절하게 짝을 맞추지 않은 코드는 사실상 에러에 가깝습니다. | 921 | 사용되어야 합니다. 적절하게 짝을 맞추지 않은 코드는 사실상 에러에 가깝습니다. |
945 | 922 | ||
946 | 범용 배리어들은 범용 배리어끼리도 짝을 맞추지만 이행성이 없는 대부분의 다른 | 923 | 범용 배리어들은 범용 배리어끼리도 짝을 맞추지만 multicopy 원자성이 없는 |
947 | 타입의 배리어들과도 짝을 맞춥니다. ACQUIRE 배리어는 RELEASE 배리어와 짝을 | 924 | 대부분의 다른 타입의 배리어들과도 짝을 맞춥니다. ACQUIRE 배리어는 RELEASE |
948 | 맞춥니다만, 둘 다 범용 배리어를 포함해 다른 배리어들과도 짝을 맞출 수 있습니다. | 925 | 배리어와 짝을 맞춥니다만, 둘 다 범용 배리어를 포함해 다른 배리어들과도 짝을 |
949 | 쓰기 배리어는 데이터 의존성 배리어나 컨트롤 의존성, ACQUIRE 배리어, RELEASE | 926 | 맞출 수 있습니다. 쓰기 배리어는 데이터 의존성 배리어나 컨트롤 의존성, ACQUIRE |
950 | 배리어, 읽기 배리어, 또는 범용 배리어와 짝을 맞춥니다. 비슷하게 읽기 배리어나 | 927 | 배리어, RELEASE 배리어, 읽기 배리어, 또는 범용 배리어와 짝을 맞춥니다. |
951 | 컨트롤 의존성, 또는 데이터 의존성 배리어는 쓰기 배리어나 ACQUIRE 배리어, | 928 | 비슷하게 읽기 배리어나 컨트롤 의존성, 또는 데이터 의존성 배리어는 쓰기 배리어나 |
952 | RELEASE 배리어, 또는 범용 배리어와 짝을 맞추는데, 다음과 같습니다: | 929 | ACQUIRE 배리어, RELEASE 배리어, 또는 범용 배리어와 짝을 맞추는데, 다음과 |
930 | 같습니다: | ||
953 | 931 | ||
954 | CPU 1 CPU 2 | 932 | CPU 1 CPU 2 |
955 | =============== =============== | 933 | =============== =============== |
@@ -1361,57 +1339,74 @@ A 의 로드 두개가 모두 B 의 로드 뒤에 있지만, 서로 다른 값 | |||
1361 | : : +-------+ | 1339 | : : +-------+ |
1362 | 1340 | ||
1363 | 1341 | ||
1364 | 행성 | 1342 | MULTICOPY |
1365 | ------ | 1343 | ---------------- |
1366 | 1344 | ||
1367 | 이행성(transitivity)은 실제의 컴퓨터 시스템에서 항상 제공되지는 않는, 순서 | 1345 | Multicopy 원자성은 실제의 컴퓨터 시스템에서 항상 제공되지는 않는, 순서 맞추기에 |
1368 | 맞추기에 대한 상당히 직관적인 개념입니다. 다음의 예가 이행성을 보여줍니다: | 1346 | 대한 상당히 직관적인 개념으로, 특정 스토어가 모든 CPU 들에게 동시에 보여지게 |
1347 | 됨을, 달리 말하자면 모든 CPU 들이 모든 스토어들이 보여지는 순서를 동의하게 되는 | ||
1348 | 것입니다. 하지만, 완전한 multicopy 원자성의 사용은 가치있는 하드웨어 | ||
1349 | 최적화들을 무능하게 만들어버릴 수 있어서, 보다 완화된 형태의 ``다른 multicopy | ||
1350 | 원자성'' 라는 이름의, 특정 스토어가 모든 -다른- CPU 들에게는 동시에 보여지게 | ||
1351 | 하는 보장을 대신 제공합니다. 이 문서의 뒷부분들은 이 완화된 형태에 대해 논하게 | ||
1352 | 됩니다만, 단순히 ``multicopy 원자성'' 이라고 부르겠습니다. | ||
1353 | |||
1354 | 다음의 예가 multicopy 원자성을 보입니다: | ||
1369 | 1355 | ||
1370 | CPU 1 CPU 2 CPU 3 | 1356 | CPU 1 CPU 2 CPU 3 |
1371 | ======================= ======================= ======================= | 1357 | ======================= ======================= ======================= |
1372 | { X = 0, Y = 0 } | 1358 | { X = 0, Y = 0 } |
1373 | STORE X=1 LOAD X STORE Y=1 | 1359 | STORE X=1 r1=LOAD X (reads 1) LOAD Y (reads 1) |
1374 | <범용 배리어> <범용 배리어> | 1360 | <범용 배리어> <읽기 배리어> |
1375 | LOAD Y LOAD X | 1361 | STORE Y=r1 LOAD X |
1376 | 1362 | ||
1377 | CPU 2 의 X 로드가 1을 리턴했고 Y 로드가 0을 리턴했다고 해봅시다. 이는 CPU 2 의 | 1363 | CPU 2 의 Y 로의 스토어에 사용되는 X 로드의 결과가 1 이었고 CPU 3 의 Y 로드가 |
1378 | X 로드가 CPU 1 의 X 스토어 뒤에 이루어졌고 CPU 2 의 Y 로드는 CPU 3 의 Y 스토어 | 1364 | 1을 리턴했다고 해봅시다. 이는 CPU 1 의 X 로의 스토어가 CPU 2 의 X 로부터의 |
1379 | 전에 이루어졌음을 의미합니다. 그럼 "CPU 3 의 X 로드는 0을 리턴할 수 있나요?" | 1365 | 로드를 앞서고 CPU 2 의 Y 로의 스토어가 CPU 3 의 Y 로부터의 로드를 앞섬을 |
1380 | 1366 | 의미합니다. 또한, 여기서의 메모리 배리어들은 CPU 2 가 자신의 로드를 자신의 | |
1381 | CPU 2 의 X 로드는 CPU 1 의 스토어 후에 이루어졌으니, CPU 3 의 X 로드는 1을 | 1367 | 스토어 전에 수행하고, CPU 3 가 Y 로부터의 로드를 X 로부터의 로드 전에 수행함을 |
1382 | 리턴하는게 자연스럽습니다. 이런 생각이 이행성의 한 예입니다: CPU A 에서 실행된 | 1368 | 보장합니다. 그럼 "CPU 3 의 X 로부터의 로드는 0 을 리턴할 수 있을까요?" |
1383 | 로드가 CPU B 에서의 같은 변수에 대한 로드를 뒤따른다면, CPU A 의 로드는 CPU B | 1369 | |
1384 | 의 로드가 내놓은 값과 같거나 그 후의 값을 내놓아야 합니다. | 1370 | CPU 3 의 X 로드가 CPU 2 의 로드보다 뒤에 이루어졌으므로, CPU 3 의 X 로부터의 |
1385 | 1371 | 로드는 1 을 리턴한다고 예상하는게 당연합니다. 이런 예상은 multicopy | |
1386 | 리눅스 커널에서 범용 배리어의 사용은 이행성을 보장합니다. 따라서, 앞의 예에서 | 1372 | 원자성으로부터 나옵니다: CPU B 에서 수행된 로드가 CPU A 의 같은 변수로부터의 |
1387 | CPU 2 의 X 로드가 1을, Y 로드는 0을 리턴했다면, CPU 3 의 X 로드는 반드시 1을 | 1373 | 로드를 뒤따른다면 (그리고 CPU A 가 자신이 읽은 값으로 먼저 해당 변수에 스토어 |
1388 | 리턴합니다. | 1374 | 하지 않았다면) multicopy 원자성을 제공하는 시스템에서는, CPU B 의 로드가 CPU A |
1389 | 1375 | 의 로드와 같은 값 또는 그 나중 값을 리턴해야만 합니다. 하지만, 리눅스 커널은 | |
1390 | 하지만, 읽기나 쓰기 배리어에 대해서는 이행성이 보장되지 -않습니다-. 예를 들어, | 1376 | 시스템들이 multicopy 원자성을 제공할 것을 요구하지 않습니다. |
1391 | 앞의 예에서 CPU 2 의 범용 배리어가 아래처럼 읽기 배리어로 바뀐 경우를 생각해 | 1377 | |
1392 | 봅시다: | 1378 | 앞의 범용 메모리 배리어의 사용은 모든 multicopy 원자성의 부족을 보상해줍니다. |
1379 | 앞의 예에서, CPU 2 의 X 로부터의 로드가 1 을 리턴했고 CPU 3 의 Y 로부터의 | ||
1380 | 로드가 1 을 리턴했다면, CPU 3 의 X 로부터의 로드는 1을 리턴해야만 합니다. | ||
1381 | |||
1382 | 하지만, 의존성, 읽기 배리어, 쓰기 배리어는 항상 non-multicopy 원자성을 보상해 | ||
1383 | 주지는 않습니다. 예를 들어, CPU 2 의 범용 배리어가 앞의 예에서 사라져서 | ||
1384 | 아래처럼 데이터 의존성만 남게 되었다고 해봅시다: | ||
1393 | 1385 | ||
1394 | CPU 1 CPU 2 CPU 3 | 1386 | CPU 1 CPU 2 CPU 3 |
1395 | ======================= ======================= ======================= | 1387 | ======================= ======================= ======================= |
1396 | { X = 0, Y = 0 } | 1388 | { X = 0, Y = 0 } |
1397 | STORE X=1 LOAD X STORE Y=1 | 1389 | STORE X=1 r1=LOAD X (reads 1) LOAD Y (reads 1) |
1398 | <읽기 배리어> <범용 배리어> | 1390 | <데이터 의존성> <읽기 배리어> |
1399 | LOAD Y LOAD X | 1391 | STORE Y=r1 LOAD X (reads 0) |
1400 | 1392 | ||
1401 | 이 코드는 이행성을 갖지 않습니다: 이 예에서는, CPU 2 의 X 로드가 1을 | 1393 | 이 변화는 non-multicopy 원자성이 만연하게 합니다: 이 예에서, CPU 2 의 X |
1402 | 리턴하고, Y 로드는 0을 리턴하지만 CPU 3 의 X 로드가 0을 리턴하는 것도 완전히 | 1394 | 로부터의 로드가 1을 리턴하고, CPU 3 의 Y 로부터의 로드가 1 을 리턴하는데, CPU 3 |
1403 | 합법적입니다. | 1395 | 의 X 로부터의 로드가 0 을 리턴하는게 완전히 합법적입니다. |
1404 | 1396 | ||
1405 | CPU 2 의 읽기 배리어가 자신의 읽기는 순서를 맞춰줘도, CPU 1 의 스토어와의 | 1397 | 핵심은, CPU 2 의 데이터 의존성이 자신의 로드와 스토어를 순서짓지만, CPU 1 의 |
1406 | 순서를 맞춰준다고는 보장할 수 없다는게 핵심입니다. 따라서, CPU 1 과 CPU 2 가 | 1398 | 스토어에 대한 순서는 보장하지 않는다는 것입니다. 따라서, 이 예제가 CPU 1 과 |
1407 | 버퍼나 캐시를 공유하는 시스템에서 이 예제 코드가 실행된다면, CPU 2 는 CPU 1 이 | 1399 | CPU 2 가 스토어 버퍼나 한 수준의 캐시를 공유하는, multicopy 원자성을 제공하지 |
1408 | 쓴 값에 좀 빨리 접근할 수 있을 것입니다. 따라서 CPU 1 과 CPU 2 의 접근으로 | 1400 | 않는 시스템에서 수행된다면 CPU 2 는 CPU 1 의 쓰기에 이른 접근을 할 수도 |
1409 | 조합된 순서를 모든 CPU 가 동의할 수 있도록 하기 위해 범용 배리어가 필요합니다. | 1401 | 있습니다. 따라서, 모든 CPU 들이 여러 접근들의 조합된 순서에 대해서 동의하게 |
1410 | 1402 | 하기 위해서는 범용 배리어가 필요합니다. | |
1411 | 범용 배리어는 "글로벌 이행성"을 제공해서, 모든 CPU 들이 오퍼레이션들의 순서에 | 1403 | |
1412 | 동의하게 할 것입니다. 반면, release-acquire 조합은 "로컬 이행성" 만을 | 1404 | 범용 배리어는 non-multicopy 원자성만 보상할 수 있는게 아니라, -모든- CPU 들이 |
1413 | 제공해서, 해당 조합이 사용된 CPU 들만이 해당 액세스들의 조합된 순서에 동의함이 | 1405 | -모든- 오퍼레이션들의 순서를 동일하게 인식하게 하는 추가적인 순서 보장을 |
1414 | 보장됩니다. 예를 들어, 존경스런 Herman Hollerith 의 C 코드로 보면: | 1406 | 만들어냅니다. 반대로, release-acquire 짝의 연결은 이런 추가적인 순서는 |
1407 | 제공하지 않는데, 해당 연결에 들어있는 CPU 들만이 메모리 접근의 조합된 순서에 | ||
1408 | 대해 동의할 것으로 보장됨을 의미합니다. 예를 들어, 존경스런 Herman Hollerith | ||
1409 | 의 코드를 C 코드로 변환하면: | ||
1415 | 1410 | ||
1416 | int u, v, x, y, z; | 1411 | int u, v, x, y, z; |
1417 | 1412 | ||
@@ -1444,8 +1439,7 @@ CPU 2 의 읽기 배리어가 자신의 읽기는 순서를 맞춰줘도, CPU 1 | |||
1444 | } | 1439 | } |
1445 | 1440 | ||
1446 | cpu0(), cpu1(), 그리고 cpu2() 는 smp_store_release()/smp_load_acquire() 쌍의 | 1441 | cpu0(), cpu1(), 그리고 cpu2() 는 smp_store_release()/smp_load_acquire() 쌍의 |
1447 | 연결을 통한 로컬 이행성에 동참하고 있으므로, 다음과 같은 결과는 나오지 않을 | 1442 | 연결에 참여되어 있으므로, 다음과 같은 결과는 나오지 않을 겁니다: |
1448 | 겁니다: | ||
1449 | 1443 | ||
1450 | r0 == 1 && r1 == 1 && r2 == 1 | 1444 | r0 == 1 && r1 == 1 && r2 == 1 |
1451 | 1445 | ||
@@ -1454,8 +1448,9 @@ cpu0() 의 쓰기를 봐야만 하므로, 다음과 같은 결과도 없을 겁 | |||
1454 | 1448 | ||
1455 | r1 == 1 && r5 == 0 | 1449 | r1 == 1 && r5 == 0 |
1456 | 1450 | ||
1457 | 하지만, release-acquire 타동성은 동참한 CPU 들에만 적용되므로 cpu3() 에는 | 1451 | 하지만, release-acquire 에 의해 제공되는 순서는 해당 연결에 동참한 CPU 들에만 |
1458 | 적용되지 않습니다. 따라서, 다음과 같은 결과가 가능합니다: | 1452 | 적용되므로 cpu3() 에, 적어도 스토어들 외에는 적용되지 않습니다. 따라서, 다음과 |
1453 | 같은 결과가 가능합니다: | ||
1459 | 1454 | ||
1460 | r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 | 1455 | r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 |
1461 | 1456 | ||
@@ -1482,8 +1477,8 @@ u 로의 스토어를 cpu1() 의 v 로부터의 로드 뒤에 일어난 것으 | |||
1482 | 이런 결과는 어떤 것도 재배치 되지 않는, 순차적 일관성을 가진 가상의 | 1477 | 이런 결과는 어떤 것도 재배치 되지 않는, 순차적 일관성을 가진 가상의 |
1483 | 시스템에서도 일어날 수 있음을 기억해 두시기 바랍니다. | 1478 | 시스템에서도 일어날 수 있음을 기억해 두시기 바랍니다. |
1484 | 1479 | ||
1485 | 다시 말하지만, 당신의 코드가 글 이행을 필요로 한다면, 범용 배리어를 | 1480 | 다시 말하지만, 당신의 코드가 퍼레들 전한 순서를 필요로 한다면, |
1486 | 사용하십시오. | 1481 | 범 배리어를 용하십시오. |
1487 | 1482 | ||
1488 | 1483 | ||
1489 | ================== | 1484 | ================== |
@@ -3058,6 +3053,9 @@ AMD64 Architecture Programmer's Manual Volume 2: System Programming | |||
3058 | Chapter 7.1: Memory-Access Ordering | 3053 | Chapter 7.1: Memory-Access Ordering |
3059 | Chapter 7.4: Buffering and Combining Memory Writes | 3054 | Chapter 7.4: Buffering and Combining Memory Writes |
3060 | 3055 | ||
3056 | ARM Architecture Reference Manual (ARMv8, for ARMv8-A architecture profile) | ||
3057 | Chapter B2: The AArch64 Application Level Memory Model | ||
3058 | |||
3061 | IA-32 Intel Architecture Software Developer's Manual, Volume 3: | 3059 | IA-32 Intel Architecture Software Developer's Manual, Volume 3: |
3062 | System Programming Guide | 3060 | System Programming Guide |
3063 | Chapter 7.1: Locked Atomic Operations | 3061 | Chapter 7.1: Locked Atomic Operations |
@@ -3069,6 +3067,8 @@ The SPARC Architecture Manual, Version 9 | |||
3069 | Appendix D: Formal Specification of the Memory Models | 3067 | Appendix D: Formal Specification of the Memory Models |
3070 | Appendix J: Programming with the Memory Models | 3068 | Appendix J: Programming with the Memory Models |
3071 | 3069 | ||
3070 | Storage in the PowerPC (Stone and Fitzgerald) | ||
3071 | |||
3072 | UltraSPARC Programmer Reference Manual | 3072 | UltraSPARC Programmer Reference Manual |
3073 | Chapter 5: Memory Accesses and Cacheability | 3073 | Chapter 5: Memory Accesses and Cacheability |
3074 | Chapter 15: Sparc-V9 Memory Models | 3074 | Chapter 15: Sparc-V9 Memory Models |