2014-12-07 3 views
0

배열 T array[N]을 내 CPU에 공급한다고 가정합니다. 여기에서 T은 큰 유형이고 바이트보다 큰 큰 struct입니다. 64 바이트도 CPU의 캐시 라인 크기라고 가정합니다. 내 질문은 : 무엇이 관측 가능한 행동이되어야 하는가? 나는 무엇을 진단 할 수 있는가?캐시 라인보다 큰 유형을 처리 할 때 Intel CPU의 예상되는 동작은 무엇입니까?

분명히 나는 ​​내 T과 내 array이 모두 포장되고 정렬되어 있으며 관련 데이터 구조가 메모리의 레이아웃과 배치에 관한 한 최적화되어 있다고 가정합니다. 나의 주요 초점은 T> 캐시 라인과 이런 상황에서 일어날 일을 설명 할 수있는 기술에 관한 것이다.

+0

유형이 캐시 라인보다 크더라도 실제 머신 코드는 128 비트 또는 그보다 작은 액세스로만 사용자의 유형에 액세스합니다. 따라서 더 작은 유형의 배열과 다르지 않습니다. – JS1

답변

3

CPU에 유형이 표시되지 않으며 특히 struct 유형 또는 기타 언어 관련 캡슐화가 없습니다. 그것은 당신의 컴파일러가 분리하는 개별 필드에 대한 액세스만을 볼 수 있습니다. 이 모든 필드는 정수, 포인터 또는 끝 부분의 부동 소수점 중 하나이며 CPU는이를 효율적으로 처리 할 수 ​​있습니다.

+0

나는 그 크기에 대해'T'를 언급했다, 나는 CPU가 정말로 일반적인 방식으로 "주소 지정 가능"한 것을 볼 수 있다는 것을 안다. 나의 관점은이 점을 고려하는 방법과 CPU가이 경우 어떻게 작동하는지이다; 예를 들어, 63 바이트의 데이터로 채워진 64 바이트의 캐시 라인은 정렬되지 않은 것으로 간주되며, 이는 성능 측면에서 약간의 손실을 초래할 수 있습니다.이 경우는 어떻습니까? 그리고 당신이 그것을 언급 했으므로, 제 CPU가 서명되지 않은 부호있는 정수를 관리하는 방법을 설명 할 좋은 출처에 대해서도 눈을 뜨고 싶습니다. 그러나 이것은 아마도 구약입니다. – user2485710

+0

우리가 서로를 이해하는지 확신 할 수 없습니다. 컴파일러는 여러분을 위해 모든 작업을하고 있습니다. 예를 들어, 여러분은 여러분의 데이터가'struct' 내부에 적절하게 정렬되어 이러한 것들에 대해 걱정할 필요가 없도록 할 수 있습니다. 대부분 'struct'에있는 모든 필드를 필요로하지 않는다면 실제로 필요한 것보다 더 많은 캐시 라인에 데이터를 분산시킬 수 있습니다. 그러나 이것은 정수 배열의 모든 요소를 ​​액세스하는 것과 크게 다르지 않습니다. –

+0

나는 컴파일러 부분을 얻는다, 나는이 경우 CPU가 무엇을하고 있는지 그리고 어떤 프로토콜을 기반으로 하는지를 설명하는 데 어려움을 겪고있다. 예를 들어 데이터 어레이 ("어레이"는 "핫"데이터 시퀀스를 의미 함)는 일반적으로 배열 [N]과 같이 캐시 라인의 크기에 따라 동일한 부분으로 분할됩니다. 여기서 N은 64보다 훨씬 큽니다. 64 바이트의 덩어리로 나뉘어져 있고 멀티 코어 CPU의 다른 코어에 공급됩니다.이 시점에서 캐시 일관성이 작동하는 방식과 필요한 이유를 비교적 쉽게 이해할 수 있습니다. 어떤 T가 단일 캐시 라인에 맞지 않는 경우 어떤 프로토콜이 유효합니까? – user2485710

관련 문제