2014-07-25 4 views
4

현대의 x86 CPU는 레지스터

Table of registers

RAM이 16 비트 또는 128 비트를 추출하는 데 동일한 시간이 걸립니까? SSE와 AVX/2

내가 (> 128 비트) 내 프로그램의 속도가 느려지고 가장 큰 레지스터의 일부를 사용하기로 결정하는 경우의 톤이있다? 왜?

고유 한 해결 방법을 찾을 수 없습니다. 모델에 따라 올바르게 이해하면 CPU는 매번 (64, 128 비트) 특정 양의 RAM을 추출하지만 요청한 비트를 사용하는 경우에만 추출합니다. 맞습니까?

가능하다면,이 예제에 설명을 적용 필요한 데이터가 캐시에없는 경우

mov al, 0xFF ;8bit ns=?? 
mov ax, 0xFFFF ;16bit ns=?? 
mov eax, 0xAABBAABB ; 32bit ns=?? 
mov rax, 0xAABBCCDDAABBCCDD 
mov xmm0, ... 
mov zmm0, variable512bit 
; and the opposite 
mov variable512bit, zmm0 
+1

로드/저장 단위의 너비에 따라 다릅니다. 단위가 레지스터 크기보다 짧으면 더 작은 연산으로 분할해야합니다. 예를 들어, Sandy Bridge와 모든 AMD 불도저 프로세서는 256 비트 레지스터를 지원하지만 128 비트 폭의로드/저장 기능을 가지고 있습니다. – Mysticial

+0

* RAM *, * Register * 및 * Cache *는 동일한 것이 아닙니다. 자신이 의미하는 바를 어디에서나 명확하게 설명하십시오. 또한 CPU 자체는 X86 어셈블리를 직접 구현하지 않으며, 디코드 작업 중 런타임시이를 마이크로 코드 명령어로 변환합니다. 이러한 작업을 수행하는 데 걸리는 시간은 CPU 설계에서 CPU 설계에 이르기까지 다양합니다. – aruisdante

+0

내 Intel/AMD CPU 지원에서 512bit 레지스터까지,/sendinf 데이터를 RAM 메모리로로드하는 데 걸린 시간은 ** 모든 크기에서 ** 동일하거나 ** xxbits까지 동일합니다. 시간이 선형 적으로 증가합니다 ** 또는 ** 아니오, 적은 비트가 항상 더 많거나 적은 시간이 걸림 ** – incud

답변

2

L1 캐시에서 레지스터를 채우는 데 필요한 시간은 프로세서 -L1 캐시 인터페이스에 따라 다릅니다. 프로세서 -L1 인터페이스의 너비는 일반적으로 캐시 라인과 동일하거나 더 작습니다. Nehalem에서는 캐시 라인 크기가 64 바이트인데도 한주기에 16 바이트를로드 할 수 있습니다. 다른 아키텍처의 일부 번호는 here입니다.

L1 hit 가정하에 질문에 대답하십시오 : 레지스터 크기가 processor-L1 인터페이스보다 작거나 같으면 코드 속도가 느려지지 않습니다. 액세스가 정렬되지 않은 경우 두 가지 액세스가 발생하여 데이터를 가져오고 코드 속도가 느려집니다.

캐시 미스의 경우 메모리 인터페이스가 코드 성능을 결정합니다. 메모리 대역폭은 캐시 대역폭보다 훨씬 작습니다.

SIMD 레지스터 (AVX 및 SSE)는 프로세서 -LI 인터페이스보다 더 넓을 수 있습니다.

+1

AMD 's 불도저/Pavedriver 마이크로 아키텍처는 두 개의 128 비트 포트를 가지고 있지만 256 비트 AVX (YMM) 레지스터를 지원하므로 SIMD 레지스터가 L1 인터페이스보다 넓지는 않습니다. –

+0

@ PaulA.Clayton 코멘트 주셔서 감사합니다. 방금이 문제를 해결하기 위해 게시물을 편집했습니다. – aminfar

+1

캐시 히트를 가정하는 것으로 추가 할 수 있습니다. 액세스가 캐시 미스 인 경우 ([eckes 'answer] (http://stackoverflow.com/a/24963517)), 캐시 인터페이스가 아닌 메모리 인터페이스에 의해 제한되는 것으로 나타났습니다. –

0


는 일반적으로 CPU의 RAM에서 캐시 라인을 가져옵니다. 최근 x64에서 캐시 라인은 64 바이트입니다. 따라서 더 넓은 레지스터를 사용하면 메모리에서 읽는 데 동일한 시간이 걸리고 데이터를 처리하는 데 필요한 시간이 줄어 듭니다. 즉, 고급 opcode 중 일부는 out-of-order/parallel/predictive 처리에 대해 서로 다른 (더 많은) 클럭 사이클 또는 기회가있을 수 있습니다. MOV에 대한 확신이 없습니다. 그러나 일반적으로이 영역에서 최적화해야하는 경우에는 자체 성능 특성이있는 SIMD를보고 싶을 수도 있습니다.

주석에서 설명한대로 더 큰 레지스터를 사용하는 것이 항상 가능한 것은 아닙니다. 가능한 한 많은 레지스터를 사용하는 것이 바람직하므로 작은 데이터 항목에 대해서는 더 작은 레지스터를 사용하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다 :) 그래서 저는 맞습니다. x86 아키텍처의 ** mov 명령어 **에 대한 "완벽한"크기는 64 비트 (더 빠르게로드되는 것)입니다. SIMD 명령어는 다른 시간 (일반적으로 더 많이, 때로는 같음, 결코 적지 않게)을 제외하고는 더 빠릅니다. ? – incud

+0

@Mysticial이 말한 바에 따르면,로드/저장 유닛 (최대 128 비트, Sandy Bridge)이 더 중요하거나 캐시 라인이 64 비트가 더 중요합니까? – incud

+0

나는 예/아니오로 대답하기에는 너무 복잡하다고 생각한다 (그리고 나는 충분히 경험하지 못했다). 예를 들어 좋은 이유가없는 큰 레지스터를 "낭비"하거나 정렬되지 않은 액세스 나 비트를 운반해야하는 경우 더 작은 레지스터를 사용하는 것이 좋습니다. – eckes