Cache – PoC vs PoU

ARM Cache Identification

  • CTR(Cache Type Register)를 읽어서 Level 1 명령어 캐시의 정책(VIPT)과 cache line을 알아온다.
  • CLIDR(Cache Level ID Register)를 통해 7개의 캐시 타입필드를 읽는다. 각 단계의 캐시의 종류(I, D, I+D)를 알아내고 LoU 및 LoC를 알아온다.
  • CCSSR(Cache Sizae Selection Register)를 사용해 요청받은 캐시레벨을 선택하고 캐시 종류를 선택한 후 CCSIDR(Cache Size ID Register)를 읽어 캐시 정보를 획득한다.
  • 참고: ARM 시스템 주요 레지스터

 

캐시 조작 명령 Flush

Flush라는 용어는 여러 아키텍처에서 다음 3가지 항목과 동일하게 혼용되어 사용되어 구현 의도를 파악하기 어렵게 만든다. 따라서 ARM 매뉴얼에서는 flush라는 용어를 사용하지 않고 다음 아래와 같은 표기를 사용한다.

  • Clean
    • 현재 레벨의 캐시 라인을 다음 레벨의 캐시나 메모리에 기록한다.
  • Invalidate
    • 현재 레벨의 캐시 라인을 비운다.
  • Clean & Invalidate
    • 현재 레벨의 캐시 라인을 다음 레벨의 캐시나 메모리에 기록한 후 비운다.

 

PoC(Point of Coherency)

특정한 MVA를 위해 PoC는 접근하는 모든 agent(cores, bus(dma, mmio))들이 메모리 위치의 동일한 사본 값을 access할 수 있게 보장하는 포인트이다.

  • ARMv7 아키텍처에는 CP15 레지스터를 사용하여 PoC를 지원하는 명령이 다음과 같이 3가지가 지원되며 이 명령을 사용하여 PoC 에서 Coherency를 만족하게 할 수 있다.
    • DCIMVAC (Data Cache Invalidate MVA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 버림으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
    • DCCMVAC (Data Cache Clean VMA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 저장하게 함으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
    • DCCIMVAC(Data Cache Clean & Invalidate VMA to poC)
      • PoC 까지 하나의 Data 캐시 라인을 저장하게 하고 버림으로서 PoC 위치에서 동일한 메모리 데이터의 사본을 access할 수 있다.
  • 메모리 데이터 사본
    • 캐시는 메모리 데이터의 사본을 보관하고 있다.
  • ARMv7 아키텍처에서는 특정 가상 주소 영역에 대해 PoC 까지 한꺼번에 처리하는 명령이 없어서 루프를 돌며 하나 하나 캐시 라인 별로 아래의 PoC 명령을 처리 해야 한다.
  • PoC는 대부분 BUS에 연결된 DRAM이 위치한 곳이다. 이 위치에서 Core, DSP 및 DMA 엔진 등이 같은 데이터를 access할 수 있도록 보장한다.
  • ARM v7 아키텍처는 최대 7단계 까지의 캐시를 지원하며 PoC 명령으로 처리할 수 있는 캐시 레벨은 다음 레지스터에 기록되어 있다.
    • CLIDR 레지스터의 LoC(Level of Coherency) 필드에 기록되어 있다.
    • 예) rpi2에서 사용된 BCM2709 SoC에는 LoC(PoC를 캐시 구현 레벨로 표현) 값이 2(L2 캐시)이다. 즉 PoC 명령을 사용 시 SoC가 캐시 레벨 2까지 처리한다.
  • Cache Coherency H/W Unit
    • SMP 시스템을 위해 Data 캐시들 끼리의 coherent를 보장하게 하는 하드웨어 장치이다.
      • Data 캐시와 메모리의 coherent는 자동으로 하지 않고 PoC 명령 등을 통해 수동으로 수행한다.
    • ARM사는 Cache Coherency를 하드웨어로 보장하게 하는 장치를 IP block으로 제공한다. (SCU, Corelink series… 등).
    • 보통 SoC 제조사들은 ARM사의 IP block 중 하나를 선택하여 cache coherent 장치를 구성하는데 일부 SoC 제조사는 자사가 가지고 있는 cache coherency 장치를 사용하는 경우도 있다.
    • Cache Coherency H/W 장치를 사용하는 cpu-캐시, GPU, ACP(Accelerator Coherency Port) 및 ACP-lite 에 연결된 장치들은 특별히 PoC 관련 명령을 수행하지 않아도 하드웨어가 지원하는 기능에 의해 자동적으로 coherency를 보장하게 한다. 그러나 이러한 cache coherent DMA(ACP, ACP-Lite 등) 하드웨어 장치를 사용하지 않는 구형 DMA 디바이스 등에서는 드라이버를 구현할 때에 반드시 PoC 명령 등을 사용하여야 한다.
  • 추가 캐시 컨트롤러
    • CP15를 통해 처리하지 못하는 캐시 컨트롤러에 대해서는 공급사가 관련 캐시 명령들을 제공하여야 한다.

cache4

PoU(Point of Unification)

Process에서의 PoU는 instruction 캐시와 data 캐시 그리고 TLB 캐시가 동일한 데이터를 바라보는 것을 보장하는 포인트이다.

  • ARMv7 아키텍처에서는 CP15 레지스터를 사용하여 PoU를 지원하는 명령이 다음과 같이 4가지가 제공된다.
    • DCCMVAU(Data Cache Clean MVA to poU)
      • PoU 직전까지 dirty된 하나의 data 캐시 라인을 PoU 위치로 기록하게 한다.

      ICIALLUIS(Instruction Cache Invalidate ALL to poU Inner Shareable)

      • Inner shareable 캐시 중 PoU 직전 캐시까지 전체 instruction 캐시를 비운다.
    • ICIALLU(Instruction Cache Invalidate ALL to poU)
      • PoU 직전까지 전체 instruction 캐시를 비운다.
    • ICIMVAU(Instruction Cache Invalidate VMA to poU)
      • PoU 직전까지 하나의 instruction 캐시 라인을 비운다.
  • ARM v7 아키텍처는 최대 7단계 까지의 캐시를 지원하며 PoU 명령으로 처리할 수 있는 캐시 레벨은 다음 레지스터에 기록되어 있다. 보통 통합 캐시를 지정하거나 DRAM 메모리 위치가 된다.
    • CLIDR 레지스터의 LoUU(Level of Unification Uniprocessor) 및 LoUIS(Level of Unification Inner Shareable) 필드에 기록되어 있다.
    • ARMv7 아키텍처는 LoU 및 LoUIS값으로 1(L2 캐시)을 사용하는데 L2 캐시가 통합 지점을 의미한다.
      • 확인해봐야 할 사항:
        • ARM 레퍼런스 매뉴얼에서 숫자 1은 보통 L1 캐시를 말하는데 LoU에 대해서는 숫자 1을 L2로 표기하였다.
        • Instruction 캐시와 Data 캐시의 coherency를 통합 캐시 위치인 PoU에서 보장하기 위해 PoU 직전 레벨의 캐시까지 조작한다.
        • 아래 그림에서도 PoU가 L2인 경우 L1까지 캐시를 처리하는 것처럼 색상이 구분되어 있다.
  • 용도
    • Self-modifing 코드
      • ARM에서 하바드 캐시를 사용하는 캐시 레벨들에 대해서는 instruction 코드를 변경한 후 재 사용하기 위해 h/w가 자동으로 cache coherency를 처리하지 못하므로 이러한 캐시 영역은 CP15 PoU 관련 명령을 사용하여 직접 처리해야 한다.
      • PoU 직전까지의 data 캐시를 먼저 clean한 후, 다시 PoU 직전까지의 instruction 캐시를 invalidate 하여 data 캐시와 instruction 캐시의 coherency를 PoU 에서 보장한다.

cache5

 

LoC(Level of Coherency for the cache hierarchy)

PoC를 위해 cache hierarchical을 지원하는 캐시 구성에서 처음 레벨의 캐시(L1)부터 LoC가 지정한 캐시 레벨까지 캐시 조작 명령을 수행해야 하는 레벨을 가리킨다.

  • 예) rpi2: PoC=RAM, LoC=2(L2)
    • L1 ~ L2 캐시까지 cache operation 명령을 수행한다.

 

LoU / LoUU(Level of Unification Uniprocessor for the cache hierachy)

PoU를 위해 cache hierarchical을 지원하는 캐시 구성에서 처음 레벨의 캐시(L1)부터 LoUU가 지정한 캐시 레벨(한 개 코어에서 가장 가까운 통합 캐시)-1까지 캐시 조작 명령을 수행하여 LoU 위치에서 데이터 캐시와 instruction 캐시의 coherency를 보장하게 한다.

  • 예) rpi2: PoU=L2, LoU=1(L2 통합 캐시)
    • L1 캐시까지 cache operation 명령을 수행한다.

 

LoUIS(Level of Unification Inner Shareable for the cache hierarchy)

Multiprocess Extensions에서만 구현되며 PoU를 위해 cache hierachical을 지원하는 캐시 구성에서 Inner shareable domain을 위해 처음 레벨의 캐시(L1)부터 LoUIS가 지정한 캐시 레벨까지 (L2-1)-1 까지 캐시 조작 명령을 수행하여 LoUIS 위치에서 데이터 캐시와 instruction 캐시의 coherency를 보장하게 한다.

  • 예) rpi2: PoU=L2, LoUIS=1(L2 통합 캐시)
    • L1 캐시까지 cache operation 명령을 수행한다.

 

ARM 아키텍처별 캐시 레벨 속성 값

cache6

 

 참고

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.