문제

내가 노력하고 프로필을 최적화 알고리즘을 이해하고 싶의 구체적인 영향을 캐시에서 다양한 프로세서를 지원합니다.최신 Intel x86 프로세서(예:Q9300),그것은 매우 어려운에 대한 자세한 정보를 찾을 캐시 구조입니다.특히,대부분의 웹 사이트(등 Intel.com 는)포스트 프로세서는 스펙을 포함하지 않는 모든 대한 참조를 L1 캐시입니다.이기 때문에 L1 캐시 존재하지 않거나 이 정보를 위해 몇 가지 이유로 중요하지 않은 것으로 간주됩?이 있는 기사거나에 대한 토론의 제거 L1cache?

[편집] 후 실행하는 다양한 테스트하고 진단 프로그램(대부분 사람들이 논의에 대한 답변을 아래),제가 결론을 내 Q9300 것 같 32K L1 데이터 캐시입니다.나는 아직도 찾을 수 없는 명확한 설명이 왜 이 정보는 그래서에 의해 제공하기가 어렵습니다.나의 현재 작동하는의 세부 사항 L1 캐싱은 지금 치료를 받으로 무역하여 비밀을 인텔 등이 있습니다.

도움이 되었습니까?

해결책

그것은 거의 불가능을 찾는 사양에 인텔합니다.때 나는 가르치고 있었는 클래스에 캐시 작년에,저는 그 친구가 내부에 Intel(컴파일러 그룹) 을 찾을 수 없습니다.

하지만 잠깐!!! Jed, 고,축복하고 그의 영혼을 우리에게 알려는 리눅스 시스템에서 수 많은 정보를 커널:

grep . /sys/devices/system/cpu/cpu0/cache/index*/*

이렇게 하면 연관성,설정 크기,그리고 무리의 다른 정보에(하지만 지연).예를 들어,는 것을 배웠지만 AMD 광고하는 그들의 128K L1 캐시 내 AMD 계는 분할 I D 캐시 64K 각.


두 개의 제안이 이제는 주로 사용되지 않 감사 Jed:

  • AMD 게시 많은에 대한 자세한 내용을 캐시할 수 있도록 적어도 몇 가지 정보에 대해 현대 캐시입니다.예를 들어,지난해 AMD L1 캐시 전달 두 단어 사이클(peak).

  • 오픈 소스 도구 valgrind 는 모든 종류의 캐시 모델로는 그 안에,그리고 그것은 소중한 프로파일링을 위한 이해와 캐시 동작입니다.그것은 매우 좋은 시각화 도구 kcachegrind 의 일부입 KDE SDK.


예를 들어:in Q3 2008,AMD K8/K10 Cpu 를 사용하 64 바이트 캐시 라인 64kB 각 L1I/L1D 분할 캐시입니다.L1D2-방법으로 결합하고 독점적으로 L2,대기의 3 주기입니다.L2 캐시 16-방법으로 결합 및 대기 시간은 약 12 주기입니다.

AMD 불도저족 Cpu 을 사용할 L1 로 16kiB4-way 연관 L1D 클러스터당(2 개의 코어당).

Intel Cpu 유지 L1 같은 장시간(에서 펜티엄 M Haswell 하는 스카이 레이크,그리고 아마도 많은 세대는 그 후):분 32kB 각 I D 캐시와 L1D 는 8-방법으로 연합.64 바이트 캐시 라인과 일치하는 버스트 전송 크기의 DDR DRAM.부하 사용-대기 시간을~4 주기입니다.

태그 위키에 대한 링크를 보려면 성능과 microarchitectural 데이터입니다.

다른 팁

이 인텔 매뉴얼 : Intel® 64 및 IA-32 아키텍처 최적화 참조 설명서 캐시 고려 사항에 대한 괜찮은 논의가 있습니다.

enter image description here

46 페이지, 섹션 2.2.5.1 Intel® 64 및 IA-32 아키텍처 최적화 참조 설명서

Microslop조차도 캐시 사용 및 성능을 모니터링하기 위해 더 많은 도구가 필요하다고 깨어 났으며 getLogicalProcessorInformation () 함수 예제 (... 프로세스에서 엄청나게 긴 기능 이름을 만드는 데 새로운 트레일을 타는 동안) 코드를 올릴 것이라고 생각합니다.

업데이트 I : Hazwell은 캐시로드 성능을 2x로 증가시킵니다. 토크 내부; Haswell의 건축

캐시를 최대한 활용하는 것이 얼마나 중요한지 의심이 있다면 이 프레젠테이션 이전에 Azul의 Cliff Click은 의심의 여지가 없어야합니다. 그의 말에 따르면, "메모리는 새로운 디스크입니다!"

Haswell’s URS (Unified Reservation Station)

업데이트 II : Skylake의 크게 개선 된 캐시 성능 사양.

SkyLake Cache Specifications

개발자 사양이 아닌 소비자 사양을보고 있습니다. 다음은 원하는 문서입니다. 캐시 크기는 프로세서 패밀리 서브 모델에 따라 다르므로 일반적으로 IA-32 개발 매뉴얼에 있지 않지만 Newegg 등을 쉽게 찾을 수 있습니다.

편집하다: 보다 구체적으로 : Volume 3A (Systems Programming Guide), 최적화 참조 매뉴얼 7 장 및 TLB 페이지 캐싱 매뉴얼의 잠재적 인 것들이 있지만, 당신이 관심있는 것보다 L1에서 더 멀어 졌다고 가정 할 것입니다.

나는 좀 더 조사했다. ETH Zurich의 그룹이 메모리 성능 평가 도구 L1 및 L2 캐시의 적어도 크기 (및 아마도 연관성)에 대한 정보를 얻을 수 있습니다. 이 프로그램은 실험적으로 다른 읽기 패턴을 시도하고 결과 처리량을 측정하여 작동합니다. 단순화 된 버전이 사용되었습니다 Bryant와 O'Hallaron의 인기 교과서.

L1 캐시는이 플랫폼에 존재합니다. 이것은 메모리와 전면 버스 속도가 CPU의 속도를 초과 할 때까지 거의 확실하게 사실을 유지합니다.

Windows에서는 사용할 수 있습니다 GetLogicalProcessorInformation Win7의 EX 버전은 어떤 수준의 캐시 정보 (크기, 라인 크기, 연관성 등)를 얻으려면 어떤 캐시 공유와 같은 더 많은 데이터를 제공합니다. CPUZ 이 정보도 제공합니다.

참조의 위치 일부 알고리즘의 성능에 큰 영향을 미칩니다. L1, L2 (및 최신 CPUS L3)의 크기와 속도는 분명히 이것에서 큰 부분을 차지합니다. 행렬 곱셈은 이러한 알고리즘 중 하나입니다.

인텔 매뉴얼 Vol. 2 캐시 크기를 계산하기 위해 다음 공식을 지정합니다.

이 캐시 크기는 바이트입니다

= (ways + 1) * (파티션 + 1) * (line_size + 1) * (세트 + 1)

= (ebx [31:22] + 1) * (ebx [21:12] + 1) * (ebx [11 : 0] + 1) * (ecx + 1)

어디에 Ways, Partitions, Line_Size 그리고 Sets 사용을 쿼리합니다 cpuid ~와 함께 eax 로 설정 0x04.

헤더 파일 선언 제공

x86_cache_size.h:

unsigned int get_cache_line_size(unsigned int cache_level);

구현은 다음과 같이 보입니다.

;1st argument - the cache level
get_cache_line_size:
    push rbx
    ;set line number argument to be used with CPUID instruction
    mov ecx, edi 
    ;set cpuid initial value
    mov eax, 0x04
    cpuid

    ;cache line size
    mov eax, ebx
    and eax, 0x7ff
    inc eax

    ;partitions
    shr ebx, 12
    mov edx, ebx
    and edx, 0x1ff
    inc edx
    mul edx

    ;ways of associativity
    shr ebx, 10
    mov edx, ebx
    and edx, 0x1ff
    inc edx
    mul edx

    ;number of sets
    inc ecx
    mul ecx

    pop rbx

    ret

내 컴퓨터에서 다음과 같이 작동합니다.

#include "x86_cache_size.h"

int main(void){
    unsigned int L1_cache_size = get_cache_line_size(1);
    unsigned int L2_cache_size = get_cache_line_size(2);
    unsigned int L3_cache_size = get_cache_line_size(3);
    //L1 size = 32768, L2 size = 262144, L3 size = 8388608
    printf("L1 size = %u, L2 size = %u, L3 size = %u\n", L1_cache_size, L2_cache_size, L3_cache_size);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top