문제

인텔의 32 비트 프로세서와 같은 펜티엄에 있는 64 비트로 다양한 데이터 버스고 따라서 가져 오는 8 바이트당 액세스입니다.이에 따라,제가 생길 것 같아요 물리 주소는 이러한 프로세서 방출에 주는 버스가 항상의 배수 8.

첫째,이 결론은 정확합니까?

둘째로,그것이 올바른 경우,다음 중 하나를 맞추어야 합 데이터 구조를 구성원에 8 바이트의 경계가 있습니다.하지만 내가 본 사람들이 사용하는 4 바이트의 정렬을 대신에 이러한 프로세서를 지원합니다.

할 수 있는 방법들에 의롭다 하심을 얻고 그렇게?

도움이 되었습니까?

해결책

일반적인 경험 법칙 (Intels 및 AMD의 최적화 매뉴얼에서 직접)은 모든 데이터 유형이 자체 크기로 정렬되어야한다는 것입니다. an int32 32 비트 경계에 정렬되어야합니다 int64 64 비트 경계 등. 숯은 어디서나 잘 맞습니다.

또 다른 경험의 규칙은 물론 "컴파일러는 정렬 요구 사항에 대해 들었습니다"입니다. 컴파일러가 데이터에 효율적으로 액세스 할 수 있도록 올바른 패딩 및 오프셋을 추가하는 것을 알고 있기 때문에 걱정할 필요가 없습니다.

유일한 예외는 SIMD 지침으로 작업 할 때 대부분의 컴파일러에 대한 정렬을 수동으로 보장해야합니다.

둘째, 정확한 경우 8 바이트 경계에서 데이터 구조 멤버를 정렬해야합니다. 그러나 나는이 프로세서에서 4 바이트 정렬을 사용하는 사람들을 보았습니다.

나는 그것이 어떻게 차이를 만드는지 모르겠다. CPU는 단순히 4 바이트를 포함하는 64 비트 블록에 대한 읽기를 단순히 발행 할 수 있습니다. 즉, 요청 된 데이터 전에 또는 그 이후에 4 개의 추가 바이트를 얻는다는 것을 의미합니다. 그러나 두 경우 모두 단일 읽기 만 필요합니다. 32 비트 전체 데이터의 32 비트 정렬은 64 비트 경계를 넘지 않도록합니다.

다른 팁

물리적 버스는 64 비트가 다수의 8-->네

그러나,두 개의 더 많은 요소를 고려하십시오:

  1. 일부 86 명령어 세트는 바이트로 해결됩니다.몇몇은 32 비트로 정렬(는 이유가 있는 4 바이트는 것).러(core)명령은 64 비트 정렬되어 있습니다.CPU 처리할 수 있는 비뚤어 데이터에 액세스 할 수 있습니다.
  2. 당신이 성능에 대해 생각해야 합니다 캐시 줄지 주요 메모리입니다.캐시선은 훨씬 더 넓다는 것입니다.

8 바이트 정렬로 변경하면 ABI 변화가 발생하고 한계 성능 개선은 문제가되지 않기 때문에 그렇게 정당화됩니다.

다른 사람이 이미 말했듯이, 캐시 라인은 중요합니다. 실제 메모리 버스의 모든 액세스는 캐시 라인 (x86, IIRC의 64 바이트)입니다. 이미 언급 된 "모든 프로그래머가 메모리에 대해 알아야 할 사항"문서를 참조하십시오. 따라서 실제 메모리 트래픽은 64 바이트 정렬되었습니다.

임의의 액세스와 데이터가 잘못 정렬되지 않는 한 (예 : 경계를 넘어서는), 나는 그것이 중요하다고 생각하지 않습니다. 데이터의 올바른 주소와 오프셋은 하드웨어의 단순하고 구조적으로 찾을 수 있습니다. 하나의 읽기 액세스가 하나의 값을 얻기에 충분하지 않으면 느려집니다. 그렇기 때문에 컴파일러는 일반적으로 특정 오프셋에있을 필요가 없기 때문에 작은 값 (바이트 등)을 함께 넣습니다. 반바지는 주소, 4 바이트 주소에 32 비트, 8 바이트 주소에 64 비트에 있어야합니다.

캐싱이 관련되어 있고 선형 데이터 액세스가있는 경우 상황이 다릅니다.

당신이 참조하는 64 비트 버스는 캐시를 먹이게합니다. CPU로서 항상 전체 캐시 라인을 읽고 씁니다. 캐시 라인의 크기는 항상 8의 배수이며 물리적 주소는 실제로 8 바이트 오프셋으로 정렬됩니다.

캐시 대 등록 전송은 외부 데이터 버스를 사용하지 않으므로 해당 버스의 너비는 관련이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top