2012-09-19 1 views
14

정렬되지 않은 액세스는 런타임 오류를 일으키고 프로그램이 충돌하거나 메모리 액세스가 느려지므로 항상 잘못되었다고 들었습니다. 그러나 나는 그들이 물건을 느리게 것입니다 얼마나에 대한 실제 데이터를 찾을 수 없습니다.x86에서 정렬되지 않은 성공적인 액세스의 실제 효과는 무엇입니까?

내가 x86에 있고 정렬되지 않은 액세스의 일부 (아직 알려지지 않은 공유)를 갖고 있다고 가정 할 때 실제로 가능한 최악의 속도는 무엇이며 어떻게 정렬되지 않은 액세스를 모두 제거하고 두 버전의 코드의 런타임을 비교하지 않고도이를 예측할 수 있습니까?

+0

엄지 손가락 : 대부분의 아키텍처에서 정렬되지 않은 읽기는 정렬 된 읽기와 비교하여 ~ 2 배의 성능을 나타냅니다. 데이터를 얻고 수정하기 위해 두 번의 읽기 사이클이 필요합니다. 글쓰기는 좀 더 복잡합니다. –

답변

13

대부분의 x86 SSE로드/저장 명령어 (정렬되지 않은 변형 제외)의 경우 명령에 따라 오류가 발생하여 프로그램이 중단되거나 많은 왕복으로 이어질 수 있습니다. 예외 처리기 (거의 모든 성능이 손실됨을 의미). 정렬되지 않은로드/저장 변형은 부분 읽기/쓰기를 수행하므로 IIRC 사이클의 두 배로 실행되므로 운이 좋고 캐시에없는 경우 페널티가 크게 감소하지 않는 한 2를 수행해야합니다.

일반적인 x86로드/저장 명령어의 경우 읽기 또는 쓰기 작업에 더 많은 사이클이 필요하므로 처리 속도가 빠릅니다. 정렬 불일치는 또한 캐쉬에 영향을 미치고, 캐쉬 라인 분할 및 캐쉬 경계 범람을 초래할 수 있습니다. 또한 읽기 및 쓰기에 대한 원 자성을 방지합니다 (x86, 배리어 및 전파의 모든 정렬 된 읽기/쓰기에 대해 보장됨). 정렬되지 않은 데이터에 대한 LOCK'ed 명령을 사용하면 예외가 발생하거나 이미 벌금이 크게 증가 할 수 있습니다. 잠금이 발생 함). 이는 동시 프로그래밍을위한 아니오입니다.

Intels x86 & x64 optimizations manual은 앞서 언급 한 각 문제, 부작용 및 해결 방법에 대해 자세히 설명합니다.

Agner Fog' optimization manuals에는 원시 사이클 처리량과 관련하여 원하는 정확한 수치가 있어야합니다.

+0

Agner Fog 논문을 보았지만 구체적인 숫자를 찾을 수 없었습니다. 올바른 페이지/테이블을 가르쳐 주시겠습니까? –

+0

@NitsanWakart : 정렬되지 않은 SSE 지침은 http://www.agner.org/optimize/instruction_tables.pdf에 나열되어 있습니다. 개발자 안내서의 해당 인텔 장을 참조하는 데 필요한 일반 지침에 대한 처벌에 대한 처벌 8 또는 9 IIRC, 정렬되지 않은 읽기는 사이클을 두 번 필요함) – Necrolis

+0

최근의 (코어 2 이후의) cpus를 사용하여 정렬되지 않은 (캐시 라인 보행이 아닌) 액세스에서 특히 MOV에 대한 페널티를 찾고 있습니다. Agner의 인스트럭션 테이블에서는 벌칙을 찾을 수 없으며 데이터를 정렬하기위한 일반적인 조언을 제외하고는 인텔 매뉴얼에서 관련 참조를 찾을 수 없습니다. –

2

일반적으로 현대 프로세서의 예상 속도는 매우 복잡합니다. 이것은 정렬되지 않은 액세스뿐만 아니라 일반적으로 사실입니다.

현대 프로세서는 파이프 라인 아키텍처를 가지고 있으며, 명령어의 순서가 정해지지 않고 병렬 적으로 실행될 수 있으며 실행에 영향을 줄 수있는 많은 다른 것들이 있습니다.

정렬되지 않은 액세스가 지원되지 않는 경우 예외가 발생합니다. 그러나 지원되는 경우 많은 요소에 따라 속도가 느려질 수도 있고 그렇지 않을 수도 있습니다. 이러한 요인에는 정렬되지 않은 명령어의 전후에 실행 한 다른 명령어가 포함됩니다 (프로세서가 이전 명령어를 실행하는 동안 데이터를 가져 오기 시작하거나 대기중인 동안 후속 명령어를 수행 할 수 있기 때문에).

정렬되지 않은 액세스가 캐시 라인 경계에서 발생하는 경우 매우 다른 중요한 차이가 발생합니다. 일반적으로 정렬되지 않은 액세스에 대해 캐시에 대한 2 배 액세스가 발생할 수 있습니다. 액세스가 캐시 라인 경계를 넘어 서서 이중 캐시 누락을 야기 할 경우 실제 속도가 저하됩니다. 최악의 경우, 정렬되지 않은 2 바이트 읽기는 프로세서가 두 개의 캐시 라인을 메모리로 플러시 한 다음 메모리에서 2 개의 캐시 라인을 읽도록 요구할 수 있습니다. 그것은 많은 데이터 이동입니다.

최적화를위한 일반적인 규칙은 다음과 같습니다. 첫 번째 코드, 측정 한 다음 문제가있는 경우에만 솔루션을 찾아냅니다.

5

일부 인텔 마이크로 아키텍처에서는 캐시 라인 경계로 분할 된로드가 평소보다 12 사이클 더 오래 걸리고 페이지 경계로 분할 된로드는 200 사이클 이상 오래 걸립니다. 루프에서 일관되게로드가 정렬되지 않으면 두 개의 정렬 된로드를 수행하고 palignr 옵션이 아닌 경우에도 수동으로 결과를 병합하는 것이 좋습니다.SSE의 정렬되지 않은 부하조차도 중간에 정확히 분리되지 않으면 사용자를 저장하지 않습니다.

AMD에서 이것은 문제가되지 않았으며 문제는 Nehalem에서 대부분 사라졌지만 여전히 Core2가 많이 있습니다.