시뮬레이터 도구로 'sim-outorder'을 사용하고자 한다.
내 최종 목표는 victim cache를 구현하는 것이므로 sim-outorder.c에서 cache와 관련된 부분을 하나씩 살펴보고자 한다.
1. 캐시 옵션과 성능 변수
우선, 가장 처음에 cache와 관련된 변수들이 선언되어있다. data, instruction cache의 레벨별 opt와 lat는 구성 설정과 hit 지연 시간을 의미한다.
1-1) cache_opt
opt부분을 자세히 살펴보고자 caache_dl1_opt부분을 모두 확인해보았다.
'opt_reg_string' 함수는 options.c에서 관리하는 함수로, 옵션을 처리하는데 사용되는 함수이다. 명령행에서 전달되는 옵션 값을 처리하고 변수에 할당하는 작업을 수행한다. 인자를 하나하나 살펴보자.
'opt_reg_string'는 인자가 struct opt_odb_t *odb(옵션 데이터베이스), char *name(옵션명), char *desc(처리할 옵션 설명), char **var(옵션 값을 저장할 변수의 주소), char *def_val(옵션의 디폴트 값), *int print('-dumpconfig'명령을 사용할 경우 옵션 값 출력 여부), char *format(옵션 값 출력시 사용될 포맷)으로 구성되어있다.
따라서 위의 캐시 옵션에 의해
./sim-outorder -cache:dl1 dl1:64:32:2:l
이런식으로 명령을 내리면 dl1:64:32:2:l 이 옵션 값을 l1 데이터 캐시에 저장하게 되어, 옵션 값을 재구성할 수 있다.
첫번째 가정문 'if(!mysrtricmp(cache_dl1_opt,"none"))'을 살펴보면,
cache_dl1_opt값이 none인 경우엔 cache_dl1을 비활성화하고, dl1이 비활성상태인데 dl2가 none이 아니면 에러를 발생시키는 것이다. (l2가 정의되기 위해서는 l1이 정의되어야 한다)
그 다음 else 부분을 살펴보면(l1이 정의가 되어있는 경우),
cache_dl1_opt 값들을 읽는다. 따라서 'cache_create' 함수를 이용하여 추출한 옵션값들로 캐시 객체를 생성하고 필요한 설정을 적용한다. 이후, l2가 있다면 위와 동일한 방식으로 캐시를 생성하고 없다면 캐시를 생성하지 않는다.
'cache_create'함수는 cache.c 파일에 있으므로, 내용이 궁금하다면 읽어보는 것도 좋을 것 같다.
1-2) cache_lat
lat변수가 사용되는 코드를 살펴보았다.
이 부분은 cache_dl1의 액세스를 처리하는 부분으로, 스토어 명령의 값을 l1 데이터에 커밋하고 이 과정에서 캐시 미스가 발생하면 이를 처리하는 것이다. ('cache_access' 함수 역시 cache.c에서 볼 수 있다.)
cache_access를 중심으로 살펴보자.
cache_dl1에 스토어 명령값을 커밋하는 액세스 수행 / wirte-> 쓰기 액세스 / 'LSQ[LSQ_head].addr&~3'-> 주소에서 마지막 2비트를 제거하여 워드 경계에 정렬된 주소 계산 / 4-> 4바이트 크기의 데이터 / sim_cycle-> 시뮬레이션 사이클을 나타내는 변수
'if (lat > cache_dl1_lat) ' : 캐시 액세스의 지연시간(lat)이 l1 데이터 캐시의 적중 지연 시간보다 크다면, 캐시 미스가 발생한 것으로 처리하는 것이다. 이후, events |= PEV_CACHEMISS를 통해 비트를 설정하여 시뮬레이션 결과 분석시 사용한다.
2. cache
이 함수는 데이터 캐시 l1에서 블록 액세스를 처리하는 함수로, 이 캐시에서 특정 블록에 대한 액세스 지연 시간을 계산하고 반환하는 역할을 한다. 데이터 캐시 l2가 존재하는 경우엔 l2캐시에 접근하여 지연 시간을 계산하고 읽기 작업인 경우엔 lat 반환, 쓰기 작업인 경우엔 0을 반환한다. (쓰기 작업은 기록하는 작업이므로 0으로 모델링을 하는 것이 실제 동작을 잘 반영하는 방법이다) 만일, l2가 없는 경우엔 메인 메모리로 접근한다.
'Hardware > 실습' 카테고리의 다른 글
simplescalar[2] - 디렉토리와 파일 분석 및 실습 (0) | 2023.08.18 |
---|---|
simplescalar[1] - simplescalar란? (0) | 2023.08.11 |