열려 있는
닫다

프로세서의 캐시는 무엇을 담당합니까? 프로세서 캐싱에 대한 새로운 접근 방식입니다. 볼륨은 무엇이며 어떤 영향을 미치나요?

CPU 캐시- RAM에 대한 액세스 속도를 높이기 위해 프로세서 내부의 특수 메모리. 프로세서 캐시는 매우 짧은 시간에 액세스할 수 있기 때문에 주 메모리라고도 합니다. 일반적으로 프로세서의 캐시는 소위 정적 메모리(SRAM)라고 불리는 클래식 플립플롭을 기반으로 합니다. 예를 들어, RAM은 수시로 재충전되는 커패시터를 기반으로 구축됩니다. 트리거는 거의 즉각적인 액세스를 제공하지만 두 가지 주요 단점이 있습니다.

  • 상대적으로 높은 제조 비용
  • 지속적인 에너지 소비
  • 이를 기반으로 RAM을 만드는 것을 허용하지 않는 것은 SRAM의 이러한 제한 사항입니다.

    프로세서 캐시 수준

    최신 프로세서에서 캐시는 여러 수준으로 나뉩니다.

    캐시 메모리 알고리즘

    캐시 작동 알고리즘은 프로세서에 있는 특수 컨트롤러에 의해 제어됩니다. 상황에 따라 작동 패턴을 동적으로 변경할 수 있습니다. 그러나 일반적인 캐시 알고리즘은 다음과 같습니다.

    프로세서가 읽기 요청을 하면, 캐시 컨트롤러캐시에서 값을 찾아 찾은 경우 프로세서에 보냅니다. 값을 찾을 수 없으면 컨트롤러는 더 낮은 수준의 캐시나 RAM으로 요청을 보냅니다. 캐시는 낮은 수준에서 값을 읽은 후 이 값을 자체에 추가하고 다음에 액세스할 때 즉시 프로세서에 제공합니다.

    프로세서가 RAM에 쓰기 요청을 하면 캐시 컨트롤러자체적으로 값을 업데이트하고 더 낮은 수준으로 전달합니다. 결국 값은 RAM으로 끝납니다. 쓰기 캐시는 일반적으로 이 알고리즘을 사용하여 작동합니다. 물론 값을 캐시에만 저장할 수 있지만 다른 구성 요소(예: DMA - 직접 메모리 액세스)는 RAM에 액세스할 때 오래된 값을 얻을 위험이 있습니다.

    캐시 빈도

    SRAM 메모리는 매우 높은 주파수에서 작동할 수 있으므로 프로세서 캐시 메모리는 일반적으로 프로세서 자체와 동일한 주파수에서 실행됩니다. 이렇게 하면 이러한 유형의 메모리 작업 속도가 더욱 향상됩니다.

    스마트 캐시

    최신 캐시 컨트롤러는 프로세서가 곧 액세스할 메모리 셀을 추측하여 미리 캐시에 로드할 수 있습니다. 예를 들어, 프로세서가 셀 42에 액세스한 다음 43에 액세스한 경우 세 번째 액세스는 셀 44에 액세스할 가능성이 높습니다. 따라서 컨트롤러는 셀 44의 값을 초고속 메모리에 미리 로드합니다.

    첫 번째 캐시

    8086 프로세서에는 6바이트 명령 캐시가 있었습니다. 소수이고 뛰어난 지적 능력은 없지만 시스템 성능이 크게 향상되었습니다. 그러나 실제 캐시가 80386 프로세서와 함께 사용되기 시작한 당시에는 RAM에 액세스하는 데 120ns의 시간이 필요했습니다. 하지만 프로세서 옆에특별하게 설치했다 캐시 메모리 칩 RAM에 대한 액세스는 RAM보다 12배 더 빨랐습니다. 하지만 이 메모리(SRAM)는 가격이 꽤 비싸고, 대용량 캐시 메모리 칩을 탑재하는 것은 수익성이 좋지 않았다. 따라서 첫 번째 프로세서 캐시는 64KB로 제한되었으며 별도로 설치되었습니다. 80486 프로세서로 시작 CPU 캐시프로세서에 직접 설치되었기 때문에 그 이름에 걸맞게 살기 시작했습니다.

    캐시 설치 위치

    위에서 언급했듯이 80386 프로세서에는 내부 캐시가 없었습니다. 캐시는 마더보드에 별도의 칩으로 설치되었습니다. 80486 프로세서 기반 컴퓨터에서는 이전과 마찬가지로 캐시가 마더보드에 있었지만 두 번째 수준이었습니다. 첫 번째 캐시 수준이 설정되었습니다. 프로세서에서 직접. 시간이 지남에 따라 칩 제조 기술이 발전함에 따라 프로세서 캐시는 RAM 컨트롤러뿐만 아니라 프로세서 안으로 완전히 이동했습니다.

    CPU 캐시프로세서 성능을 높이는 효과적인 방법입니다. RAM 작업 속도.

    L2 캐시를 사용하여 생산된 최초의 프로세서는 1995년 Pentium Pro였습니다. 256KB 또는 512KB의 온칩 L2 캐시가 있어 캐시가 마더보드에 있는 기존 펜티엄 프로세서에 비해 상당한 이점을 제공했습니다. Pentium II의 출현으로 슬롯 1 모듈의 프로세서 옆에 전용 캐시 메모리가 "고정"되었습니다. 그러나 소켓 370용 2세대 펜티엄 III만이 캐시 메모리를 프로세서 칩으로 옮겼습니다. 이는 오늘날까지 계속되고 있지만 캐시 양이 적은 프로세서도 있고 캐시 양이 많은 프로세서도 있습니다. 캐시가 큰 모델에 돈을 쓸 가치가 있나요? 과거에는 추가 캐시 메모리가 항상 성능에 눈에 띄는 영향을 미치지는 않았습니다.

    캐시 크기가 서로 다른 두 프로세서 간의 측정 가능한 차이점을 찾는 것은 항상 가능하지만, 비용을 절약하기 위해 캐시가 더 작은 프로세서를 구입하는 것도 전적으로 가능했습니다. 그러나 Core 2 Duo 이전에는 세 가지 다른 캐시 옵션을 사용할 수 있는 프로세서가 없었습니다.

    1세대 Pentium 4(Willamette, 180nm)에는 256KB의 캐시가 탑재되었으며, 보다 성공적인 2세대(Northwood, 130nm)에서는 이미 512KB의 캐시가 탑재되었습니다. 그 당시 동일한 컴퓨팅 코어에서 더 작은 캐시를 갖춘 저렴한 Celeron 프로세서가 생산되었습니다. Celeron은 고급 모델과 저가 모델에 대해 동일한 기술 기반을 갖춘 1세대 제품에 속하며 사용 가능한 캐시 크기와 FSB/코어 주파수만 다릅니다. 나중에 시장 부문을 더욱 차별화하기 위해 기능의 차이가 추가되었습니다.

    90nm Prescott 코어가 출시되면서 L2 캐시는 1MB로 늘어났으며, 이 프로세서는 2MB 65nm Cedar Mill이 출시될 때까지 Intel 데스크탑 프로세서 라인의 주류가 되었습니다. Intel은 이러한 코어 중 두 개를 사용하여 2세대 Pentium D 900 프로세서를 만들기도 했습니다. 그러나 더 빠른 클럭 속도와 더 큰 캐시 크기는 당시에도 큰 의미가 없었습니다. 오늘날 상황은 바뀌었습니다. Core 2 Duo(Conroe, 65nm)의 더 나은 성능과 더 낮은 전력 소비는 대부분 캐시 크기에 기인합니다.

    AMD는 캐시 크기를 늘리는 데 매우 신중했습니다. 아마도 이는 칩 면적(트랜지스터 예산) 때문일 가능성이 높습니다. 65nm 프로세서의 수가 시장 수요를 충족할 수 없고 수익성이 낮은 90nm 모델의 경우 이 문제는 더욱 심각하기 때문입니다. 반면 인텔은 모든 메인스트림 프로세서를 65나노 공정 기술로 생산한다는 장점이 있어 L2 캐시 용량도 계속 늘어날 전망이다. 예를 들어, 45nm Penryn 코어의 차세대 Core 2에는 최대 6MB의 L2 캐시가 장착됩니다. 이것이 마케팅 움직임으로 볼 수 있습니까? 아니면 L2 용량을 늘리면 실제로 성능이 향상됩니까? 한번 살펴보자.

    대형 L2 캐시: 마케팅 또는 생산성 향상?

    프로세서 캐시는 매우 구체적인 역할을 합니다. 자주 사용되는 데이터를 버퍼링하여 메모리 액세스 횟수를 줄입니다. 현재 RAM 용량은 모델에 따라 512MB~4GB이고, 캐시 용량은 256KB~8MB입니다. 그러나 256KB 또는 512KB의 작은 캐시 크기라도 오늘날 당연하게 여겨지는 고성능을 제공하기에 충분합니다.

    캐시 계층 구조를 구성하는 방법에는 여러 가지가 있습니다. 대부분의 최신 컴퓨터에는 일반적으로 데이터 캐시와 명령 캐시로 구분되는 작은 1차 수준 캐시(L1, 최대 128KB)가 있는 프로세서가 있습니다. 더 큰 L2 캐시는 일반적으로 데이터 저장에 사용되며 Athlon 64 X2 또는 Pentium D에는 코어당 별도의 캐시가 있지만 두 개의 Core 2 Duo 프로세서 코어 간에 공유됩니다. L2 캐시는 배타적이거나 포괄적일 수 있습니다. 즉, L1 캐시 콘텐츠의 복사본을 저장할 수도 있고 저장하지 않을 수도 있습니다. AMD는 곧 AMD Phenom 프로세서의 4개 코어가 공유하는 세 번째 캐시 수준의 프로세서를 출시할 예정입니다. Intel이 현재 Core 2를 대체하기 위해 2008년에 도입할 Nehalem 아키텍처에서도 마찬가지입니다.

    L1 캐시는 항상 프로세서의 일부였지만 L2 캐시는 많은 486DX 및 Pentium 컴퓨터의 경우처럼 처음에는 마더보드에 설치되었습니다. 첫 번째 레벨 캐시에는 단순 정적 메모리 칩(SRAM, Static RAM)이 사용되었습니다. 캐시를 칩에 설치할 수 있게 될 때까지 펜티엄 프로세서의 파이프라인 버스트 캐시로 곧 대체되었습니다. 150~200MHz의 Pentium Pro는 256KB의 L2 캐시 온칩을 포함하는 최초의 프로세서가 되었으며, 데스크탑 PC 및 워크스테이션에서 가장 큰 세라믹 패키지 크기 기록을 경신했습니다. 500MHz ~ 1.13GHz의 주파수에서 작동하는 소켓 370용 펜티엄 III는 256KB의 온칩 L2 캐시를 갖춘 최초의 프로세서였으며, 이는 캐시가 CPU 속도로 실행되므로 대기 시간 이점을 제공했습니다.

    내장된 L2 캐시는 거의 모든 애플리케이션에서 상당한 성능 향상을 제공했습니다. 통합 L2 캐시의 등장은 x86 프로세서의 가장 중요한 성능 요소라고 할 수 있을 정도로 성능 향상이 매우 컸습니다. L2 캐시를 비활성화하면 듀얼 코어 프로세서의 두 번째 코어를 비활성화하는 것보다 성능이 더 저하됩니다.

    그러나 캐시 메모리는 성능 이상의 영향을 미칩니다. 제조업체가 거부 및 클럭 속도를 기반으로 프로세서를 유연하게 선택할 수 있기 때문에 저가형, 주류 및 고급형 세그먼트에 대한 다양한 프로세서 모델을 만들 수 있는 강력한 도구가 되었습니다. 크리스털에 결함이 없으면 전체 L2 캐시를 켤 수 있으며 주파수가 높아집니다. 원하는 클럭 주파수를 달성할 수 없는 경우 크리스탈은 4MB 캐시 및 저주파수를 갖춘 Core 2 Duo 6000과 같은 고급 라인의 보급형 모델이 될 수 있습니다. L2 캐시에 결함이 있는 경우 제조업체는 일부를 비활성화하고 캐시 크기가 더 작은 보급형 모델(예: 2MB의 L2 캐시가 있는 Core 2 Duo E4000 또는 심지어 캐시가 1MB에 불과한 Pentium 듀얼 코어. 이 모든 것이 사실이지만 문제는 캐시 크기의 차이가 성능에 얼마나 영향을 미치는가입니다.

    코어 2 듀오 변형

    인텔은 시장에 다양한 데스크탑 프로세서를 출시했습니다. 오늘날에도 Pentium 4와 Pentium D를 찾을 수 있지만 대부분의 모델은 Core 마이크로 아키텍처를 기반으로 구축되었습니다. 최대 3.8GHz의 클럭 속도가 매력적으로 보일 수 있지만 Pentium 4 또는 Pentium D 프로세서는 권장하지 않습니다. 그러나 2.2GHz 이상의 모든 Core 2 프로세서는 가장 빠른 Pentium D 모델(사실 Athlon 64 X2와 같은)도 능가할 수 있습니다. 클럭 당 훨씬 더 나은 성능 .

    낮은 클럭 속도 덕분에 Core 2 프로세서는 에너지 효율성이 더 높습니다. 상위 Pentium D 800 모델이 최대 130W를 "먹는" 경우 코어가 4개인 Core 2 Extreme만이 100W 임계값을 극복합니다. 모든 듀얼 코어 프로세서는 65W 이하를 소비합니다. 또한 유휴 주파수가 낮기 때문에 Core 2 Duo 프로세서의 유휴 전력 소비도 훨씬 더 낮습니다(Core 2 Duo/Quad의 경우 최대 1.2GHz, Pentium D/4의 경우 2.8GHz). 전력 소비 감소는 누설 전류 감소와 향상된 트랜지스터 설계의 영향을 받았습니다.

    현재 E 모델과 X 모델이 판매되고 있으며, X 모델은 익스트림 에디션입니다. Q는 Intel이 하나의 물리적 패키지에 2개의 듀얼 코어 다이를 배치하여 생성하는 4개의 코어를 나타냅니다. E6000 프로세서에는 모델 번호가 E6400보다 높거나 20으로 끝나는 경우(예: E6320) 4MB의 L2 캐시가 장착되어 있습니다. 00으로 끝나는 모델(예: E6600)은 FSB 266MHz(FSB1066)에서 작동하고, 50으로 끝나는 모델(E6750)은 FSB 333MHz(FSB1333)에서 작동합니다. 후자는 P35 또는 X38 칩셋이 필요하며 약간 더 높은 성능을 제공합니다. E4000은 200MHz FSB(FSB800)로 작동하며 L2 캐시는 2MB에 불과합니다. 1MB 캐시 버전은 1.6~2.0GHz 주파수의 Pentium Dual Core E2140, E2160 및 E2180으로 판매됩니다. Intel이 저렴한 프로세서에서 비활성화하는 이름과 일부 기능을 제외하면 언급된 Pentium 듀얼 코어는 Core 2 Duo와 동일합니다.

    Core 2 Duo 프로세서의 특성
    65nm 프로세서 번호 은닉처 클록 주파수 FSB 가상화 기술 신뢰할 수 있는 실행 기술
    E6850 4MB L2 3GHz 333MHz 엑스 엑스
    E6750 4MB L2 2.66GHz 333MHz 엑스 엑스
    E6700 4MB L2 2.66GHz 266MHz 엑스
    E6600 4MB L2 2.40GHz 266MHz 엑스
    E6550 4MB L2 2.33GHz 333MHz 엑스 엑스
    E6540 4MB L2 2.33GHz 333MHz 엑스
    E6420 4MB L2 2.13GHz 266MHz 엑스
    E6400 2MB L2 2.13GHz 266MHz 엑스
    E6320 4MB L2 1.86GHz 266MHz 엑스
    E6300 2MB L2 1.86GHz 266MHz 엑스
    E4600 2MB L2 2.40GHz 200MHz
    E4500 2MB L2 2.20GHz 200MHz
    E4400 2MB L2 2GHz 200MHz
    E4300 2MB L2 1.80GHz 200MHz


    플랫폼
    CPU I Intel Pentium 듀얼 코어 E2160(65nm, 1800MHz, 1MB L2 캐시), 2.4GHz(266MHz x9)
    CPU II Intel Core 2 Duo E4400(65nm, 2000MHz, 2MB L2 캐시), 2.4GHz(266MHz x9)
    CPU III Intel Core 2 Duo X6800(65nm, 3000MHz, 4MB L2 캐시), 2.4GHz(266MHz x9)
    마더보드 ASUS Blitz Formula, 개정판: 1.0
    칩셋: 인텔 P35, BIOS 1101
    메모리 Corsair CM2X1024-888C4D, 2x 1024MB DDR2-800(CL 4-4-4-12 2T)
    HDD Western Digital Raptor WD1500ADFD, 150GB, 10,000rpm, 16MB 캐시, SATA/150
    DVD-ROM 삼성 SH-S183
    비디오 카드 Zotac GeForce 8800 GTS, GPU: GeForce 8800 GTS(500MHz), 메모리: 320MB GDDR3(1,600MHz)
    사운드 카드 내장
    전원 장치 에너맥스 EG565P-VE, ATX 2.01, 510W
    시스템 소프트웨어 및 드라이버
    운영체제 윈도우 XP 프로페셔널 5.10.2600, 서비스 팩 2
    DirectX 버전 9.0c(4.09.0000.0904)
    인텔 플랫폼 드라이버 버전 8.3.1013
    nVidia 그래픽 드라이버 포스웨어 162.18

    테스트 및 설정

    3D 게임
    콜 오브 듀티 2 버전: 1.3 소매
    비디오 모드: 1280x960
    안티앨리어싱: 꺼짐
    그래픽 카드: 중간
    타임데모 데모2
    먹이 버전: 1.3
    비디오 모드: 1280x1024
    비디오 품질: 게임 기본값
    수직동기화=꺼짐
    벤치마크: THG-데모
    퀘이크 4 버전: 1.2(듀얼 코어 패치)
    비디오 모드: 1280x1024
    비디오 품질: 높음
    THG 타임데모 폐기물.map
    timedemo deco8.demo 1 (1 = 텍스처 로드)
    오디오
    레임 MP3 버전 3.98 베타 5
    오디오 CD "Terminator II SE", 53분
    mp3로 웨이브
    160kbps
    동영상
    TMPEG 3.0 익스프레스 버전: 3.0.4.24(오디오 없음)
    주먹 5분 DVD 터미네이터 2 SE(704x576) 16:9
    렌더링을 통한 멀티스레딩
    DivX 6.7 버전: 6.6(논리 CPU 4개)
    프로필: 고화질 프로필
    1패스, 3000kbit/s
    인코딩 모드: 미친 품질
    향상된 멀티스레딩
    오디오 없음
    XviD 1.1.3 버전: 1.1.3
    대상 양자화기: 1.00
    메인콘셉트 H.264 v2 버전 2.1
    260MB MPEG-2 소스(1920x1080) 16:9
    코덱: H.264
    모드: NTSC
    오디오: AAC
    프로필: 높음
    스트림: 프로그램
    응용
    WinRAR 버전 3.70
    (303MB, 파일 47개, 폴더 2개)
    압축 = 최고
    사전 = 4096kB
    오토데스크 3D 스튜디오 맥스 버전: 8.0
    캐릭터 "Dragon_Charater_rig"
    HTDV 1920x1080 렌더링
    시네벤치 버전: R10
    CPU 1개, CPU x 실행
    PCMark05 프로 버전: 1.2.0
    CPU 및 메모리 테스트
    윈도우 미디어 플레이어 10.00.00.3646
    윈도우 미디어 인코더 9.00.00.2980




    결론

    캐시 크기는 PCMark05와 같은 합성 테스트에 제한된 영향을 미치지만 대부분의 실제 응용 프로그램의 성능 차이는 상당히 컸습니다. 처음에는 이것이 놀랍게 보였습니다. 경험에 따르면 성능에 가장 눈에 띄는 차이를 제공하는 것은 합성 테스트이고 실제 애플리케이션에는 거의 영향을 미치지 않기 때문입니다.

    대답은 간단합니다. Core 2 Duo 마이크로 아키텍처를 사용하는 최신 프로세서에서는 캐시 크기가 매우 중요합니다. 우리는 4MB Core 2 Extreme X6800, 2MB Core 2 Duo E4400, 그리고 1MB L2 캐시를 갖춘 Core 2 Duo 프로세서인 Pentium Dual Core E2160을 사용했습니다. 모든 프로세서는 동일한 266MHz 시스템 버스에서 실행되었으며 9x 배율기를 사용하여 2,400MHz의 주파수를 달성했습니다. 유일한 차이점은 캐시 크기입니다. 이전 Pentium D를 제외한 모든 최신 듀얼 코어 프로세서는 동일한 칩으로 만들어지기 때문입니다. 코어가 될 코어 2 익스트림 에디션 또는 펜티엄 듀얼 코어는 사용 가능한 크리스털(결함)의 수율이나 시장 수요에 따라 결정됩니다.

    대표적인 게임 애플리케이션인 3D 슈팅 게임 프레이(Prey)와 퀘이크 4(Quake 4)의 결과를 비교해 보면 1MB와 4MB의 성능 차이는 대략 한 주파수 단계 정도다. DivX 6.6 및 XviD 1.1.2 코덱과 WinRAR 3.7 아카이버에 대한 비디오 인코딩 테스트에도 동일하게 적용됩니다. 그러나 3DStudio Max 8, Lame MP3 Encoder 또는 MainConcept의 H.264 Encoder V2와 같은 CPU 집약적인 애플리케이션은 더 큰 캐시 크기로 인해 많은 이점을 얻지 못합니다.

    그러나 65nm 공정 기술에서 45nm로 전환하는 동안 증가한 사용 가능한 전체 트랜지스터 예산을 사용하는 Intel의 접근 방식은 Core 2 Duo 마이크로 아키텍처에 특정한 의미를 갖습니다. 이러한 프로세서의 L2 캐시는 특히 두 개의 코어가 공유한다는 점을 고려하면 매우 효율적으로 작동합니다. 따라서 캐시는 다양한 메모리 주파수의 영향을 중화하고 FSB 형태의 "병목 현상"을 방지합니다. 테스트 결과 1MB의 캐시 메모리를 갖춘 프로세서의 성능이 낮다는 것이 명확하게 나타났기 때문에 이 기능은 매우 훌륭하게 수행됩니다.

    이러한 관점에서 볼 때 곧 출시될 45nm 듀얼 코어 Penryn 프로세서(Core 2 Duo E8000 라인)에 대해 L2 캐시 크기를 4MB에서 최대 6MB로 늘리는 것이 합리적입니다. 제조 공정을 65nm에서 45nm로 줄이면 인텔은 트랜지스터 예산을 늘릴 수 있고, 캐시 크기 증가 덕분에 다시 한 번 성능이 향상되는 것을 볼 수 있습니다. 그러나 Intel은 6, 4, 2 또는 1MB의 L2 캐시를 갖춘 다양한 프로세서 옵션의 이점을 누릴 수 있습니다. 다양한 옵션을 통해 인텔은 재활용 쓰레기통에 버려질 수 있는 가끔 결함에도 불구하고 웨이퍼당 더 많은 다이를 사용할 수 있습니다. 보시다시피 큰 캐시 크기는 성능뿐만 아니라 Intel의 이익에도 중요합니다.

    모든 사용자는 데이터 처리를 담당하는 프로세서와 데이터 저장을 담당하는 랜덤 액세스 메모리(RAM 또는 RAM)와 같은 컴퓨터 요소를 잘 알고 있습니다. 그러나 프로세서 캐시 메모리(캐시 CPU), 즉 프로세서 자체의 RAM(소위 울트라 RAM)도 있다는 사실을 모든 사람이 아는 것은 아닙니다.

    컴퓨터 설계자들이 프로세서 전용 메모리를 사용하게 된 이유는 무엇입니까? 컴퓨터의 RAM 용량이 충분하지 않습니까?

    실제로 오랫동안 개인용 컴퓨터에는 캐시 메모리가 없었습니다. 그러나 아시다시피 프로세서는 개인용 컴퓨터에서 가장 빠른 장치이며 새로운 CPU 세대가 나올 때마다 속도가 빨라졌습니다. 현재 속도는 초당 수십억 번의 작업으로 측정됩니다. 동시에 표준 RAM은 진화하는 동안 성능이 크게 향상되지 않았습니다.

    일반적으로 메모리 칩 기술에는 정적 메모리와 동적 메모리라는 두 가지 주요 기술이 있습니다. 설계의 세부 사항을 조사하지 않고 동적 메모리와 달리 정적 메모리는 재생성이 필요하지 않다고 말할 것입니다. 또한 정적 메모리는 정보 1비트에 4~8개의 트랜지스터를 사용하는 반면 동적 메모리는 1~2개의 트랜지스터를 사용합니다. 따라서 동적 메모리는 정적 메모리보다 훨씬 저렴하지만 동시에 훨씬 느립니다. 현재 RAM 칩은 동적 메모리를 기반으로 제조됩니다.

    프로세서와 RAM 속도 비율의 대략적인 발전:

    따라서 프로세서가 항상 RAM에서 정보를 가져오면 느린 동적 메모리를 기다려야 하며 항상 유휴 상태가 됩니다. 마찬가지로 정적 메모리를 RAM으로 사용하면 컴퓨터 비용이 몇 배로 증가합니다.

    그렇기 때문에 합리적인 타협안이 개발되었습니다. RAM의 대부분은 동적으로 유지되는 반면 프로세서는 정적 메모리 칩을 기반으로 하는 자체 고속 캐시 메모리를 갖습니다. 그 볼륨은 상대적으로 작습니다. 예를 들어 두 번째 수준 캐시의 크기는 몇 메가바이트에 불과합니다. 그러나 최초의 IBM PC 컴퓨터의 전체 RAM은 1MB 미만이었다는 점을 기억할 가치가 있습니다.

    또한, 캐싱 기술 도입의 타당성은 RAM에 있는 다양한 응용 프로그램이 프로세서에 다르게 로드하고 결과적으로 다른 응용 프로그램에 비해 우선 처리가 필요한 데이터가 많다는 사실에도 영향을 받습니다.

    캐시 기록

    엄밀히 말하면 캐시 메모리가 개인용 컴퓨터로 이전되기 전에는 이미 수십 년 동안 슈퍼컴퓨터에서 성공적으로 사용되었습니다.

    처음으로 i80386 프로세서 기반 PC에 16KB의 캐시 메모리가 나타났습니다. 오늘날 최신 프로세서는 첫 번째(가장 작은 크기의 가장 빠른 캐시 - 일반적으로 128KB)부터 세 번째(가장 큰 크기의 가장 느린 캐시 - 최대 수십 MB)까지 다양한 수준의 캐시를 사용합니다.

    처음에는 프로세서의 외부 캐시가 별도의 칩에 위치했습니다. 그러나 시간이 지나면서 캐시와 프로세서 사이에 위치한 버스에 병목 현상이 발생하여 데이터 교환 속도가 느려졌습니다. 최신 마이크로프로세서에서는 첫 번째와 두 번째 수준의 캐시 메모리가 모두 프로세서 코어 자체에 있습니다.

    오랫동안 프로세서에는 두 가지 캐시 수준만 있었지만 Intel Itanium CPU는 모든 프로세서 코어에 공통적으로 적용되는 세 번째 수준 캐시를 최초로 탑재했습니다. 4단계 캐시를 갖춘 프로세서도 개발되었습니다.

    캐시 아키텍처 및 원칙

    오늘날 사이버네틱스 분야의 최초 이론적 개발인 프린스턴 아키텍처와 하버드 아키텍처에서 유래한 두 가지 주요 유형의 캐시 메모리 조직이 알려져 있습니다. 프린스턴 아키텍처는 데이터와 명령을 저장하기 위한 단일 메모리 공간을 의미하는 반면, 하버드 아키텍처는 별도의 메모리 공간을 의미합니다. 대부분의 x86 개인용 컴퓨터 프로세서는 별도의 유형의 캐시 메모리를 사용합니다. 또한 운영 체제 가상 메모리 주소를 실제 메모리 주소로 변환하는 속도를 높이기 위해 설계된 소위 연관 변환 버퍼라는 세 번째 유형의 캐시 메모리도 최신 프로세서에 나타났습니다.

    캐시 메모리와 프로세서 사이의 상호 작용에 대한 단순화된 다이어그램은 다음과 같이 설명할 수 있습니다. 먼저, 프로세서는 가장 빠른 첫 번째 수준 캐시에 프로세서에 필요한 정보가 있는지 확인한 다음 두 번째 수준 캐시 등에 있는지 확인합니다. 캐시 수준에서 필요한 정보를 찾을 수 없으면 이를 오류 또는 캐시 누락이라고 합니다. 캐시에 정보가 전혀 없으면 프로세서는 해당 정보를 RAM이나 외부 메모리(하드 드라이브)에서 가져와야 합니다.

    프로세서가 메모리에서 정보를 검색하는 순서는 다음과 같습니다.

    프로세서가 정보를 검색하는 방법은 다음과 같습니다.

    캐시 메모리의 작동과 프로세서 컴퓨팅 장치 및 RAM과의 상호 작용을 제어하기 위해 특수 컨트롤러가 있습니다.

    프로세서 코어, 캐시 및 RAM의 상호 작용 구성 방식:

    캐시 컨트롤러는 프로세서, RAM 및 캐시 메모리 사이의 핵심 링크입니다.

    데이터 캐싱은 많은 기술과 수학적 알고리즘을 사용하는 복잡한 프로세스라는 점에 유의해야 합니다. 캐싱에 사용되는 기본 개념 중에는 캐시 쓰기 방법과 캐시 연관성 아키텍처가 있습니다.

    캐시 쓰기 방법

    캐시 메모리에 정보를 쓰는 두 가지 주요 방법은 다음과 같습니다.

    1. 후기입 방식 – 데이터는 먼저 캐시에 기록된 다음 특정 조건이 발생하면 RAM에 기록됩니다.
    2. Write-through 방식 – 데이터가 RAM과 캐시에 동시에 기록됩니다.

    캐시 연관성 아키텍처

    캐시 연관성 아키텍처는 RAM의 데이터가 캐시에 매핑되는 방식을 정의합니다. 캐싱 연관성 아키텍처의 주요 옵션은 다음과 같습니다.

    1. 직접 매핑 캐시 - 캐시의 특정 섹션이 RAM의 특정 섹션을 담당합니다.
    2. 완전 연관 캐시 - 캐시의 모든 부분이 RAM의 모든 부분과 연결될 수 있습니다.
    3. 혼합 캐시(세트 연관)

    다양한 캐시 수준은 일반적으로 다양한 캐시 연관성 아키텍처를 사용할 수 있습니다. 직접 매핑된 RAM 캐싱은 가장 빠른 캐싱 옵션이므로 이 아키텍처는 일반적으로 대규모 캐시에 사용됩니다. 결과적으로, 완전 연관 캐시는 캐시 오류(누락)가 더 적습니다.

    결론

    이 기사에서는 캐시 메모리의 개념, 캐시 메모리 아키텍처 및 캐싱 방법을 소개하고 이것이 현대 컴퓨터의 성능에 어떤 영향을 미치는지 배웠습니다. 캐시 메모리가 있으면 프로세서 작동을 크게 최적화하고 유휴 시간을 줄여 결과적으로 전체 시스템의 성능을 향상시킬 수 있습니다.

    90년대 후반 이후의 모든 프로세서에는 내부 캐시 메모리(또는 간단히 캐시)가 있습니다. 캐시는 프로세서에서 직접 처리한 명령과 데이터가 전송되는 고속 메모리입니다.

    최신 프로세서에는 첫 번째(L1)와 두 번째(L2)라는 두 가지 수준의 캐시 메모리가 내장되어 있습니다. 프로세서는 L1 캐시의 콘텐츠로 인해 약간 더 빠른 반면, L2 캐시는 일반적으로 약간 더 큽니다. 캐시 메모리는 대기 상태 없이 액세스됩니다. 레벨 1 캐시(온칩 캐시)는 프로세서 속도로 작동합니다.

    이는 프로세서에 필요한 데이터가 캐시에 있으면 처리 지연이 없음을 의미합니다. 그렇지 않으면 프로세서가 주 메모리에서 데이터를 가져와야 하므로 시스템 성능이 크게 저하됩니다.

    두 수준의 캐시 메모리 작동 원리를 질적으로 이해하기 위해 일상적인 상황을 예로 들어 보겠습니다.

    당신은 매일 같은 시간에 점심을 먹으러 카페에 오고, 항상 같은 테이블에 앉는다. 항상 표준 3코스 세트를 주문하세요.

    웨이터가 주방으로 달려가면 요리사가 음식을 쟁반에 담은 다음 주문한 음식을 가져옵니다. 예를 들어, 셋째 날에는 웨이터가 다시 부엌으로 달려갈 필요가 없도록 정해진 시간에 미리 준비된 따뜻한 점심을 쟁반에 담아 여러분을 만납니다.

    주문을 기다릴 필요가 없으며 많은 시간을 절약할 수 있습니다. 접시가 담긴 트레이는 첫 번째 레벨 캐시입니다. 그런데 넷째 날 갑자기 다른 요리, 예를 들어 디저트를 추가하고 싶습니다.

    주문한 쟁반이 이미 정해진 시간에 기다리고 있었지만 웨이터는 여전히 디저트를 먹으러 주방으로 달려가야 했습니다.

    그리고 다섯 번째에는 다시 세 가지 항목으로 구성된 메뉴가 있습니다. 여섯 번째 - 다시 디저트이지만 이전 디저트와 다릅니다. 그리고 웨이터는 당신이 주문하고 싶은 디저트가 무엇인지 모르고 (그리고 당신이 무엇을 주문할지조차 알지 못함) 다음 단계를 수행하기로 결정합니다. 테이블 옆에 그는 여러 종류의 디저트가 담긴 캐비닛을 놓습니다.

    그리고 욕망을 표현하면 모든 것이 가까이에 있으므로 부엌으로 달려갈 필요가 없습니다. 디저트 캐비닛은 두 번째 수준의 캐시입니다.

    프로세서 성능은 L1 캐시(16~128KB) 및 L2(64KB~512KB, Pentium III Heop 및 AMD Opteron에서 최대 4MB)의 크기에 따라 크게 달라집니다.

    Intel Pentium III 프로세서와 이를 기반으로 하는 Celeron 프로세서의 L1 캐시 크기는 32KB입니다. Intel Pentium 4와 이를 기반으로 하는 Celeron 및 Cheop 버전의 용량은 20KB에 불과합니다. AMD Duron, Athlon(XP/MP 포함) 및 Opteron 프로세서와 VIA SZ에는 128KB의 L1 캐시가 포함되어 있습니다.

    최신 듀얼 코어 프로세서에는 각 코어에 대한 1차 캐시가 별도로 있으므로 캐시 설명에서 128x2라는 숫자를 볼 수 있는 경우가 있습니다. 이는 각 프로세서 코어에 128KB의 L1 캐시가 있음을 의미합니다.

    L1 캐시의 크기는 가장 일반적인 작업(사무실 응용 프로그램, 게임, 대부분의 서버 응용 프로그램 등)에서 고성능을 얻는 데 중요합니다. 그 효과는 스레드 컴퓨팅(예: 비디오 처리)에서 특히 강력합니다.

    이는 Pentium 4가 대부분의 일반적인 응용 프로그램에 상대적으로 비효율적인 이유 중 하나입니다(비록 높은 클럭 속도로 보상되기는 하지만). L1 캐시는 항상 내부 프로세서 주파수에서 작동(프로세서 코어와 정보 교환)합니다.

    대조적으로, 다양한 프로세서 모델의 L2 캐시는 다양한 주파수(및 그에 따른 성능)에서 작동합니다. Intel Pentium II부터 많은 프로세서는 프로세서 내부 주파수의 절반으로 작동하는 L2 캐시를 사용했습니다.

    이 솔루션은 오래된 Intel Pentium III 프로세서(최대 550MHz)와 오래된 AMD Athlon(일부 프로세서 코어 주파수의 1/3에서 작동하는 내부 L2 캐시)에 사용되었습니다. L2 캐시 크기도 프로세서마다 다릅니다.

    이전 및 일부 최신 Intel Pentium III 프로세서에서 L2 캐시 크기는 512KB이고 다른 Pentium III 프로세서에서는 256KB입니다. Pentium III 기반 Intel Celeron 프로세서는 128KB 및 256KB L2 캐시와 함께 사용할 수 있었던 반면, Pentium 4 기반 프로세서는 128KB만 사용할 수 있었습니다. 다양한 버전의 Intel Pentium 4 Xeon 버전에는 최대 4MB의 L2 캐시가 있습니다.

    새로운 Pentium 4 프로세서(주파수가 2000MHz이고 모두 더 높은 주파수인 일부 시리즈)에는 512KB의 L2 캐시가 있고 나머지 Pentium 4에는 256KB가 있습니다. Xeop 프로세서(Pentium 4 기반)에는 256KB 또는 512KB L2 캐시가 있습니다.

    또한 세 번째 수준의 L3 캐시도 있습니다. 빠른 시스템 버스와 결합된 통합 L3 캐시는 시스템 메모리와 고속 데이터 교환 채널을 형성합니다.

    일반적으로 서버 솔루션용 프로세서나 "데스크탑" 프로세서의 특수 모델에만 L3 캐시 메모리가 장착되어 있습니다. 예를 들어 Xeon DP, Itanium 2 및 Xeon MP와 같은 프로세서 라인에는 L3 캐시 메모리가 있습니다.

    AMD Duron 프로세서에는 128KB L1 캐시와 64KB L2 캐시가 있습니다. Athlon 프로세서(가장 오래된 제품 제외), Athlon MP 및 대부분의 Athlon XP 변형에는 128KB의 L1 캐시와 256KB의 L2 캐시가 있으며 최신 Athlon XP(2500+, 2800+, 3000+ 이상)에는 512KB의 L2 캐시가 있습니다. 은닉처. AMD Opteron에는 1MB의 L2 캐시가 포함되어 있습니다.

    Intel Pentium D, Intel Pentium M, Intel Core 2 Duo 프로세서의 최신 모델은 6MB의 L2 캐시 및 Core 2 Quad - 12MB의 L2 캐시와 함께 사용할 수 있습니다.

    이 책을 집필할 당시 최신 Intel Core i7 프로세서는 4개 코어당 64KB의 L1 캐시 메모리와 각 코어당 256KB의 L2 메모리를 갖추고 있습니다. 첫 번째 및 두 번째 수준 캐시 외에도 프로세서에는 모든 코어에 공통되는 8MB에 해당하는 세 번째 수준 캐시도 있습니다.

    동일한 모델에 대해 서로 다른 L2 캐시 크기(또는 Intel Xeon MP - L3의 경우)를 가질 수 있는 프로세서의 경우 판매 시 이 크기를 표시해야 합니다(물론 프로세서 가격은 이에 따라 다릅니다). 프로세서가 "박스형" 패키지(박스 내 배송)로 판매되는 경우 일반적으로 캐시 메모리 크기가 표시됩니다.

    게임을 포함한 일반적인 사용자 작업의 경우 L2 캐시의 속도가 크기보다 더 중요합니다. 반대로 서버 작업의 경우 볼륨이 더 중요합니다. 가장 생산적인 서버, 특히 대용량 RAM(수 기가바이트)을 갖춘 서버에는 L2 캐시의 최대 크기와 최대 속도가 필요합니다.

    Pentium III 프로세서의 Cheop 버전은 이러한 매개변수에서 탁월한 성능을 유지합니다. (Xeon MP 프로세서는 프로세서 자체의 클럭 주파수와 메모리 버스가 더 높기 때문에 Pentium III Xeon보다 서버 작업에서 여전히 더 생산적인 것으로 나타났습니다.) 위에서 우리는 결론을 내립니다. 캐시 메모리는 서버 작업 간의 상호 작용을 향상시킵니다. 빠른 프로세서와 더 느린 RAM을 제공하며 데이터 처리 중에 발생하는 대기 시간을 최소화할 수도 있습니다. 프로세서 칩에 위치한 L2 캐시는 여기서 결정적인 역할을 합니다.

    거의 모든 개발자는 프로세서 캐시가 최근 방문한 메모리 영역의 데이터를 저장하는 작지만 빠른 메모리라는 것을 알고 있습니다. 정의는 짧고 매우 정확합니다. 그러나 코드 성능에 영향을 미치는 요소를 이해하려면 캐시 메커니즘에 대한 지루한 세부 정보를 아는 것이 필요합니다.

    이 기사에서는 캐시의 다양한 기능과 성능에 미치는 영향을 보여주는 여러 가지 예를 살펴보겠습니다. 예제는 C#으로 작성됩니다. 언어 및 플랫폼 선택은 성능 평가 및 최종 결론에 큰 영향을 미치지 않습니다. 당연히 합리적인 한도 내에서 배열에서 값을 읽는 것이 해시 테이블에 액세스하는 것과 동일한 언어를 선택하면 해석 가능한 결과를 얻을 수 없습니다. 번역가의 메모는 이탤릭체로 되어 있습니다.

    하브라컷 - - -

    예제 1: 메모리 액세스 및 성능

    두 번째 주기가 첫 번째 주기보다 얼마나 빠르다고 생각하시나요?
    int arr = 새로운 int;

    // 첫 번째
    for (int i = 0; i< arr.Length; i++) arr[i] *= 3;

    // 두번째
    for (int i = 0; i< arr.Length; i += 16) arr[i] *= 3;


    첫 번째 루프는 배열의 모든 값에 3을 곱하고, 두 번째 루프는 16번째 값마다만 곱합니다. 두 번째 주기만 완료됩니다. 6% 일첫 번째 사이클이지만 최신 기계에서는 두 사이클이 거의 동일한 시간에 실행됩니다. 80ms그리고 78ms(내 컴퓨터에서) 각각.

    해결책은 간단합니다. 즉, 메모리 액세스입니다. 이러한 루프의 속도는 주로 정수 곱셈 속도가 아니라 메모리 하위 시스템의 속도에 따라 결정됩니다. 다음 예에서 볼 수 있듯이 RAM에 대한 액세스 횟수는 첫 번째와 두 번째 경우 모두 동일합니다.

    예 2: 캐시 라인의 영향

    더 깊이 파고들어 1과 16뿐만 아니라 다른 단계 값도 시도해 보겠습니다.
    for (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

    다양한 단계 값 K에 대한 이 루프의 실행 시간은 다음과 같습니다.

    1에서 16까지의 단계 값에서는 작동 시간이 거의 변하지 않습니다. 그러나 16보다 큰 값을 사용하면 단계를 두 배로 늘릴 때마다 실행 시간이 약 절반씩 줄어듭니다. 이는 루프가 마술처럼 더 빠르게 실행되기 시작한다는 의미가 아니라 반복 횟수도 감소한다는 의미입니다. 1부터 16까지의 단계값으로 동작시간이 동일한 것이 핵심이다.

    그 이유는 최신 프로세서가 한 번에 한 바이트씩 메모리에 액세스하는 것이 아니라 캐시 라인이라는 작은 블록에 액세스하기 때문입니다. 일반적으로 문자열 크기는 64바이트입니다. 메모리에서 값을 읽으면 적어도 하나의 캐시 라인이 캐시에 들어갑니다. 이 행의 값에 대한 후속 액세스는 매우 빠릅니다.

    16개의 int 값이 64바이트를 차지하기 때문에 1~16단계의 루프는 동일한 수의 캐시 라인, 더 정확하게는 배열의 모든 캐시 라인에 액세스합니다. 32단계에서는 두 번째 라인마다, 64단계에서는 4번째 라인마다 액세스가 발생합니다.

    일부 최적화 기술에서는 이를 이해하는 것이 매우 중요합니다. 액세스 횟수는 메모리의 데이터 위치에 따라 다릅니다. 예를 들어 정렬되지 않은 데이터에는 주 메모리에 대한 액세스가 한 번이 아닌 두 번 필요할 수 있습니다. 위에서 알 수 있듯이 작동 속도는 두 배 느려집니다.

    예시 3: 레벨 1 및 2 캐시 크기(L1 및 L2)

    최신 프로세서에는 일반적으로 L1, L2 및 L3이라고 하는 2개 또는 3개 수준의 캐시가 있습니다. 다양한 수준에서 캐시 크기를 확인하려면 CoreInfo 유틸리티 또는 Windows API 함수 GetLogicalProcessorInfo를 사용할 수 있습니다. 두 방법 모두 각 수준의 캐시 라인 크기에 대한 정보도 제공합니다.

    내 컴퓨터에서 CoreInfo는 32KB L1 데이터 캐시, 32KB L1 명령 캐시 및 4MB L2 데이터 캐시를 보고합니다. 각 코어에는 자체 개인 L1 캐시가 있으며, L2 캐시는 각 코어 쌍에서 공유됩니다.

    캐시 맵에 대한 논리 프로세서: *--- 데이터 캐시 0, 레벨 1, 32KB, Assoc 8, LineSize 64 *--- 명령어 캐시 0, 레벨 1, 32KB, Assoc 8, LineSize 64 -*-- 데이터 캐시 1, 레벨 1, 32KB, Assoc 8, LineSize 64 -*-- 명령 캐시 1, 레벨 1, 32KB, Assoc 8, LineSize 64 **-- 통합 캐시 0, 레벨 2, 4MB, Assoc 16, LineSize 64 ---*- 데이터 캐시 2, 레벨 1, 32KB, Assoc 8, LineSize 64 ---*- 명령어 캐시 2, 레벨 1, 32KB, Assoc 8, LineSize 64 ---* 데이터 캐시 3, 레벨 1, 32KB, Assoc 8, LineSize 64 ---* 명령어 캐시 3, 레벨 1, 32KB, Assoc 8, LineSize 64 --** 통합 캐시 1, 레벨 2, 4MB, Assoc 16, LineSize 64
    이 정보를 실험적으로 확인해 보겠습니다. 이를 위해 배열을 살펴보고 16번째 값마다 증가합니다. 이는 각 캐시 라인의 데이터를 변경하는 쉬운 방법입니다. 끝에 도달하면 우리는 처음으로 돌아갑니다. 다양한 배열 크기를 확인해 보겠습니다. 배열이 더 이상 다양한 수준의 캐시에 맞지 않으면 성능이 저하됩니다.

    코드는 다음과 같습니다:

    정수 단계 = 64 * 1024 * 1024; // 반복 횟수
    int lengthMod = arr.Length - 1; // 배열 크기 - 2의 거듭제곱

    for (int i = 0; i< steps; i++)
    {
    // x & lengthMod = x % arr.Length, 왜냐하면 2의 거듭제곱이기 때문입니다.
    arr[(i * 16) & lengthMod]++;
    }


    시험 결과:

    내 컴퓨터에서는 32KB와 4MB 이후 성능이 눈에 띄게 저하됩니다. 이는 L1 및 L2 캐시의 크기입니다.

    예제 4: 명령어 병렬성

    이제 다른 것을 살펴보겠습니다. 귀하의 의견으로는 이 두 루프 중 어느 것이 더 빨리 실행될 것입니까?
    정수 단계 = 256 * 1024 * 1024;
    int a = 새로운 int ;

    // 첫 번째
    for (int i = 0; i< steps; i++) { a++; a++; }

    // 두번째
    for (int i = 0; i< steps; i++) { a++; a++; }


    두 번째 루프는 적어도 제가 테스트한 모든 머신에서 거의 두 배 빠른 속도로 실행되는 것으로 나타났습니다. 왜? 루프 내부의 명령에는 데이터 종속성이 다르기 때문입니다. 첫 번째 명령에는 다음과 같은 종속성 체인이 있습니다.

    두 번째 주기에서 종속성은 다음과 같습니다.

    최신 프로세서의 기능적 부분은 특정 수의 특정 작업을 동시에 수행할 수 있지만 일반적으로 그다지 많지는 않습니다. 예를 들어 L1 캐시의 두 주소에 있는 데이터에 대한 병렬 액세스가 가능하며 두 개의 간단한 산술 명령어를 동시에 실행하는 것도 가능합니다. 첫 번째 주기에서는 프로세서가 이러한 기능을 사용할 수 없지만 두 번째 주기에서는 사용할 수 있습니다.

    예 5: 캐시 연관성

    캐시를 설계할 때 대답해야 할 주요 질문 중 하나는 특정 메모리 영역의 데이터가 모든 캐시 셀에 저장될 수 있는지, 아니면 그 중 일부에만 저장될 수 있는지 여부입니다. 세 가지 가능한 솔루션:
    1. 직접 매핑 캐시,RAM의 각 캐시 라인의 데이터는 미리 정의된 하나의 캐시 위치에만 저장됩니다. 매핑을 계산하는 가장 간단한 방법은 row_index_in_memory % number_of_cache_cells입니다. 동일한 셀에 매핑된 두 줄은 동시에 캐시에 있을 수 없습니다.
    2. N-항목 부분 연관 캐시, 각 라인은 N개의 서로 다른 캐시 위치에 저장될 수 있습니다. 예를 들어, 16개 항목 캐시에서는 그룹을 구성하는 16개 셀 중 하나에 라인이 저장될 수 있습니다. 일반적으로 인덱스의 최하위 비트가 동일한 행은 하나의 그룹을 공유합니다.
    3. 완전 연관 캐시, 모든 라인은 모든 캐시 위치에 저장될 수 있습니다. 솔루션은 동작 면에서 해시 테이블과 동일합니다.
    직접 매핑된 캐시는 경합이 발생하기 쉽습니다. 예를 들어 두 행이 동일한 셀을 놓고 경쟁하고 교대로 캐시에서 서로를 제거하면 효율성이 매우 낮습니다. 반면, 완전 연관 캐시는 이러한 단점이 없지만 구현하기가 매우 복잡하고 비용이 많이 듭니다. 부분 연관 캐시는 구현 복잡성과 효율성 사이의 일반적인 절충안입니다.

    예를 들어 내 컴퓨터에서 4MB L2 캐시는 16개 항목 부분 연관 캐시입니다. 전체 RAM은 인덱스의 최하위 비트에 따라 라인 세트로 나뉘며, 각 세트의 라인은 16개 L2 캐시 셀의 한 그룹을 두고 경쟁합니다.

    L2 캐시에는 65,536개의 셀(4*2 20/64)이 있고 각 그룹이 16개의 셀로 구성되어 있으므로 총 4,096개의 그룹이 있습니다. 따라서 행 인덱스의 하위 12비트는 이 행이 속한 그룹을 결정합니다(2 12 = 4,096). 결과적으로 262,144(4,096 * 64)의 배수인 주소가 있는 행은 16개 셀로 구성된 동일한 그룹을 공유하고 그 안의 공간을 놓고 경쟁합니다.

    연관성 효과를 적용하려면 예를 들어 다음 코드를 사용하여 동일한 그룹의 많은 행에 지속적으로 액세스해야 합니다.

    공개 정적 긴 UpdateEveryKthByte(바이트 arr, int K)
    {
    const int 대표 = ​​1024 * 1024; // 반복 횟수

    스톱워치 sw = Stopwatch.StartNew();

    int p = 0;
    for (int i = 0; i< rep; i++)
    {
    arr[p]++;

    P += K; if (p >= arr.Length) p = 0;
    }

    Sw.Stop();
    sw.ElapsedMilliseconds를 반환합니다.
    }


    이 메서드는 배열의 K번째 요소마다 증가합니다. 끝에 도달하면 다시 시작됩니다. 상당히 많은 반복(2 20) 후에 중지합니다. 다양한 배열 크기와 K 단계 값에 대해 실행했습니다. 결과(파란색 - 긴 실행 시간, 흰색 - 짧음):

    파란색 영역은 지속적인 데이터 변경으로 인해 캐시가 이를 수용할 수 없는 경우에 해당합니다. 필요한 모든 데이터를 한 번에. 밝은 파란색은 약 80ms, 거의 흰색-10ms의 작동 시간을 나타냅니다.

    파란색 영역을 다루겠습니다.

    1. 수직선은 왜 나타나는 걸까요?수직선은 한 그룹에서 너무 많은 행(16개 이상)에 액세스하는 단계 값에 해당합니다. 이러한 값의 경우 내 컴퓨터의 16개 항목 캐시가 필요한 모든 데이터를 수용할 수 없습니다.

      잘못된 스트라이드 값 중 일부는 256과 512의 거듭제곱입니다. 예를 들어 스트라이드 512와 8MB 배열을 고려해보세요. 이 단계에서는 배열에 32개의 섹션(8 * 2 20 / 262 144)이 있으며, 이는 512개 캐시 그룹(262 144 / 512)의 셀을 두고 서로 경쟁합니다. 32개의 섹션이 있지만 각 그룹의 캐시에 있는 셀은 16개뿐이므로 모든 사람을 위한 공간이 충분하지 않습니다.

      2의 거듭제곱이 아닌 다른 단계 값은 단순히 운이 좋지 않아 동일한 캐시 그룹에 대한 액세스가 많이 발생하고 그림에 파란색 세로선이 나타나는 경우도 있습니다. 이 시점에서 정수론을 사랑하는 사람들은 생각해 보아야 합니다.

    2. 4MB 경계에서 수직선이 끊어지는 이유는 무엇입니까?배열 크기가 4MB 이하인 경우 16개 항목 캐시는 완전 연관 캐시처럼 작동합니다. 즉, 충돌 없이 배열의 모든 데이터를 수용할 수 있습니다. 하나의 캐시 그룹을 놓고 싸우는 영역은 16개 이하입니다(262,144 * 16 = 4 * 2 20 = 4MB).
    3. 왼쪽 상단에 커다란 파란색 삼각형이 있는 이유는 무엇입니까?작은 단계와 큰 배열로 인해 캐시가 필요한 모든 데이터를 수용할 수 없기 때문입니다. 여기서 캐시 연관성의 정도는 부차적인 역할을 합니다. 제한은 L2 캐시의 크기와 관련이 있습니다.

      예를 들어 배열 크기가 16MB이고 스트라이드가 128인 경우 128번째 바이트마다 액세스하므로 두 번째 배열 캐시 라인마다 수정됩니다. 캐시에 두 번째 줄을 모두 저장하려면 8MB의 캐시가 필요하지만 내 컴퓨터에는 4MB만 있습니다.

      캐시가 완전히 연관되어 있더라도 8MB의 데이터를 저장할 수는 없습니다. 이미 논의된 스트라이드가 512이고 배열 크기가 8MB인 예에서는 필요한 모든 데이터를 저장하는 데 1MB의 캐시만 필요하지만 이는 캐시 연관성이 부족하기 때문에 불가능합니다.

    4. 삼각형의 왼쪽 부분의 강도가 점차 높아지는 이유는 무엇입니까?최대 강도는 캐시 라인의 크기와 동일한 64바이트의 단계 값에서 발생합니다. 첫 번째와 두 번째 예에서 보았듯이 동일한 행에 대한 순차적 액세스에는 비용이 거의 들지 않습니다. 16바이트 간격으로 하나의 가격으로 4개의 메모리 액세스가 가능하다고 가정해 보겠습니다.

      모든 단계 값에 대한 테스트에서 반복 횟수는 동일하므로 단계가 저렴할수록 실행 시간이 단축됩니다.

    발견된 효과는 큰 매개변수 값에서 지속됩니다.

    캐시 연관성은 특정 조건에서 나타날 수 있는 흥미로운 현상입니다. 이 기사에서 논의한 다른 문제와는 달리 그다지 심각하지 않습니다. 프로그램을 작성할 때 지속적인 주의가 필요한 것은 아닙니다.

    예 6: 거짓 캐시 분할

    멀티 코어 시스템에서는 캐시 일관성이라는 또 다른 문제가 발생할 수 있습니다. 프로세서 코어에는 부분적으로 또는 완전히 별도의 캐시가 있습니다. 내 컴퓨터에서 L1 캐시는 (평소와 같이) 별도이며 각 코어 쌍에서 공유하는 두 개의 L2 캐시도 있습니다. 세부 사항은 다를 수 있지만 일반적으로 최신 멀티 코어 프로세서에는 다중 레벨 계층적 캐시가 있습니다. 또한 가장 빠르지만 가장 작은 캐시는 개별 코어에 속합니다.

    한 코어가 캐시의 값을 수정하면 다른 코어는 더 이상 이전 값을 사용할 수 없습니다. 다른 코어의 캐시 값을 업데이트해야 합니다. 게다가 업데이트도 필수 전체 캐시 라인, 캐시는 행 수준의 데이터에 대해 작동하기 때문입니다.

    다음 코드를 사용하여 이 문제를 보여드리겠습니다.

    개인 정적 int s_counter = 새 int ;

    개인 무효 UpdateCounter(int 위치)
    {
    for (int j = 0; j< 100000000; j++)
    {
    s_counter = s_counter + 3;
    }
    }


    4코어 컴퓨터에서 매개변수 0, 1, 2, 3을 사용하여 4개의 스레드에서 동시에 이 메서드를 호출하면 실행 시간은 다음과 같습니다. 4.3초. 하지만 매개변수 16, 32, 48, 64를 사용하여 메서드를 호출하면 실행 시간은 0.28초.

    왜? 첫 번째 경우, 주어진 시간에 스레드가 처리하는 네 가지 값이 모두 하나의 캐시 라인에 포함될 가능성이 높습니다. 하나의 코어가 값을 증가시킬 때마다 다른 코어의 해당 값을 포함하는 캐시 셀을 유효하지 않은 것으로 표시합니다. 이 작업 후에는 다른 모든 커널이 해당 라인을 다시 캐시해야 합니다. 이로 인해 캐싱 메커니즘이 작동하지 않게 되어 성능이 저하됩니다.

    예 7: 하드웨어 복잡성

    캐시 작동 원리가 비밀이 아닌 지금도 하드웨어는 여전히 놀라움을 선사할 것입니다. 프로세서는 최적화 방법, 경험적 방법 및 기타 구현 미묘함이 서로 다릅니다.

    일부 프로세서의 L1 캐시는 두 셀이 서로 다른 그룹에 속하는 경우 병렬로 액세스할 수 있지만 동일한 그룹에 속하는 경우 순차적으로만 액세스할 수 있습니다. 내가 아는 한, 일부는 동일한 셀의 다른 구역에 병렬로 액세스할 수도 있습니다.

    프로세서는 영리한 최적화로 여러분을 놀라게 할 수 있습니다. 예를 들어, 잘못된 캐시 공유에 대한 이전 예제의 코드는 내 집 컴퓨터에서 의도한 대로 작동하지 않습니다. 가장 간단한 경우 프로세서가 작업을 최적화하고 부정적인 영향을 줄일 수 있습니다. 코드를 약간 수정하면 모든 것이 제자리에 들어갑니다.

    이상한 하드웨어 문제의 또 다른 예는 다음과 같습니다.

    개인 정적 int A, B, C, D, E, F, G;

    개인 정적 무효 이상함()
    {
    for (int i = 0; i< 200000000; i++)
    {
    <какой-то код>
    }
    }


    대신에<какой-то код>세 가지 다른 옵션을 대체하면 다음과 같은 결과를 얻을 수 있습니다.

    필드 A, B, C, D를 증가시키는 것은 필드 A, C, E, G를 증가시키는 것보다 시간이 더 오래 걸립니다. 더 이상한 점은 필드 A와 C를 증가시키는 것이 필드 A, C보다 오래 걸린다는 것입니다. 그리고 E, G. 정확한 이유가 무엇인지는 알 수 없으나 아마도 메모리 뱅크( 예, 예, 일반 3리터 저축 메모리 뱅크를 사용하면 생각했던 것과는 다릅니다.). 이 문제에 대해 의견이 있으시면 댓글로 말씀해 주세요.

    내 컴퓨터에서는 위의 사항이 관찰되지 않지만 때로는 비정상적으로 나쁜 결과가 발생합니다. 대부분 작업 스케줄러가 자체적으로 "조정"합니다.

    이 예에서 배울 수 있는 교훈은 하드웨어의 동작을 완전히 예측하는 것이 매우 어렵다는 것입니다. 예, 할 수 있다예측을 많이 하지만 측정과 테스트를 통해 예측을 지속적으로 확인해야 합니다.

    결론

    위에서 논의한 모든 내용이 프로세서 캐시의 구조를 이해하는 데 도움이 되기를 바랍니다. 이제 이 지식을 실제로 적용하여 코드를 최적화할 수 있습니다.