2016-11-10 2 views
3

32 비트 시스템에서 하나의 메모리 읽기 사이클은 4 bytes의 데이터를 가져옵니다.
아래의 버퍼를 읽으려면 아래에 나온 128 bytes의 버퍼를 읽으려면 32 판독주기가 필요합니다. 그때 내가 그것을 빨리 읽을 수 있도록하는 방법을 알려 주시기 바랍니다 아래에 언급 한 바와 같이 현재의 버퍼를 정렬 한 경우
std :: alignas는 프로그램의 성능을 어떻게 최적화합니까?

char buffer[128]; 

지금, 가정?

alignas(128) char buffer[128]; 

메모리 읽기주기가 4 바이트로만 유지된다고 가정합니다.

+0

오버 정렬은 C++ 표준을 통해 작동하지 않을 수 있습니다. 이 질문에 답하기 위해서는 정확한 프로세서와 컴파일러가 필요합니다. – Yakk

+0

관련 : http://stackoverflow.com/questions/381244/purpose-of-memory-alignment – NathanOliver

+0

당신은 확신 할 수 없습니다. * 32 비트 머신에서 하나의 메모리 읽기 사이클은 4 바이트의 데이터를 가져옵니다. *. SIMD 명령어를 참조하십시오. –

답변

4

메모리 액세스에 사용되는 레지스터의 크기는 스토리의 한 부분 일 뿐이고 다른 부분은 캐시 라인의 크기입니다.

캐시 라인이 64 바이트이고 사용자의 char[128]이 자연스럽게 정렬되면 CPU는 일반적으로 3 개의 다른 캐시 라인을 조작해야합니다. alignas(64) 또는 alignas(128)을 사용하면 두 개의 캐시 라인 만 만질 필요가 있습니다.

메모리 매핑 된 파일을 사용하거나 스와핑 조건에서 작업하는 경우 다음 수준의 맞춤이 시작됩니다 : 메모리 페이지의 크기. 이것은 4096 또는 8192 바이트 정렬을 요구합니다.

그러나 특정 정렬이 컴파일러가 사용하는 자연 정렬보다 큰 경우 alignas()에 심각한 긍정적 효과가 있음을 심각하게 의심합니다. 메모리 사용량이 크게 늘어나 캐시 라인/메모리를 더 많이 트리거 할 수 있습니다. 페이지가 처음에 터치되었습니다. 약간의 불균형 만 피할 필요가 있습니다. 일부 CPU에서는 엄청난 속도 저하를 유발할 수 있고, 다른 CPU에서는 불법/불가능할 수도 있습니다.

따라서 진실은 측정에만 있습니다. 당신이 얻을 수있는 모든 속도 향상이 필요하다면 시도해보고 런타임 차이를 측정하고 효과가 있는지 확인하십시오.

1

32 비트 컴퓨터에서 하나의 메모리 읽기 사이클은 4 바이트의 데이터를 가져옵니다.

간단하지 않습니다. "32 비트 시스템"이라는 용어는 이미 너무 광범위하여 많은 것을 의미 할 수 있습니다. 32b 레지스터 (GP 레지스터? ALU 레지스터? 어드레스 레지스터?)? 32b 주소 버스? 32b 데이터 버스? 32b 명령어의 워드 크기?

그리고 "메모리 읽기" 누구에 의해. CPU? 은닉처? DMA 칩?

메모리가 4 바이트 (4로 정렬)로 읽히고 캐시가없는 HW 플랫폼을 사용하는 경우 alignas(128)은 (alignas(4))과 차이가 없습니다.