Date 클래스는 입력 받은 연도의 윤년 확인과 특정 달의 일 수를 구하는 method 등의 helper method를 지원하며, 이를 통해, 입력 받은 두 날짜 사이의 일수와 선후 관계 등을 구하는 기능을 제공한다. 이번 실습 과제는 4개의 part로 구성되어 있으며, 각각의 part에서 필요로 하는 기능을 구현하면 최종적으로 두 날짜 사이의 일수 계산이 가능하다. 각 part의 이해 및 실습을 통해 java에 대해 좀 더 폭넓은 이해와 더불어, 복잡한 문제 해결을 위해 문제를 작은 단위로 나누어 해결하는 방법을 습득할 수 있을 것이라 예상된다.
수식을 입력 받아 Assembly language로 compile하는 프로젝트이다. 수식은 양의 정수, 변수, *, /, +, -, =, (, ) 만을 허용하며, 빈칸 역시 허용한다. 빈칸을 입력 받는 경우 수식에는 영향을 미치지 않으며, 변수는 대문자 알파벳 1자만을 허용한다.프로젝트의 목적은 이렇게 입력 받은 수식을 올바른 Assembly language 형식으로 변환하여, 실제 compile된 assembly code를 수행했을 때 원래 수식과 같은 결과를 출력한다. Assembly language는 가상의 instruction들과 문법을 사용하며, instruction set은 핸드아웃에서 제시한 것과 같다.위의 assembly language가 수행될 machine으로는 accumulator라는 하나의 레지스터와 stack 하나만을 갖는 machine을 고려한다.
이번 과제는 SPIM Simulator에 pipeline 기능을 추가하는 것으로 SPIM simulator의 source code를 수정하여 내부적으로 pipeline이 동작하게 하는 것이 그 목적이다. Source code를 살펴보면 loop을 돌며 instruction을 수행하는데, IF stage가 수행되고 뒤이어 바로 switch statement에서 해당 instruction의 OP code를 분석하여 해당 instruction의 나머지 stage, 즉, ID, EXE, MEM, WB 단계를 한번에 수행하는 것을 볼 수 있다.따라서, 이 부분을 수정하여, loop에서 한번의 iteration을 한 cycle로 보고, 한 cycle 내에서 각각의 stage가 동시에 수행되도록 수정하면 된다. 뿐만 아니라 spec에 따라 각각의 instruction category 별 instruction의 개수, data hazard가 발생한 회수, data forwarding이 발생한 회수, load-use stall이 발생한 회수, delayed branch가 발생한 회수 등의 statistics 정보를 출력하는 루틴을 추가하면 된다.각각의 instruction category 별로 수행되는 stage가 다른데, 보통의 R-type instruction의 경우, IF/ID/EXE/MEM의 4 stage를 거쳐 수행되고, Memory reference instruction의 경우에는 IF/ID/EXE/MEM/WB의 5 stage를 모두 거쳐 수행된다. Branch나 jump와 같은 instruction의 경우에는 IF/ID/EXE의 3 stage를 거쳐 수행된다. 따라서 각각의 instruction에 따라 한번의 pipe stage에서 MEM이나 WB의 stage가 수행될 수도 있고 수행되지 않을 수도 있다. Pipeline을 구현할 경우, hazard가 발생할 가능성이 있는데, 이를 해결하는 것이 pipeline 구현의 핵심이라 할 수 있겠다.
cache의 성능에 영향을 미치는 요인들인 block placement 기법이나 replacement 기법 그리고, n-way set associative 방식의 n의 값이 cache의 성능에 어떠한 영향을 미치는 가를 분석한다.분석을 위해, 우선 direct mapped 방식으로 구현되어 있는 cache simulator의 source code를 수정하여, n-way set associative cache를 구현하고, 다양한 block replacement policy를 구현한다. 이 때, 구현할 block replacement 기법으로는 access된지 가장 오래된 block을 replace하는 LRU 기법과 가장 오래 전에 들어온 block을 replace하는 FIFO 기법, access 빈도수가 가장 작은 block을 replace하는 LFU 기법을 사용한다.수정된 cache simulator를 통해, LRU, FIFO, LFU 중 best replacement policy를 찾고, 고정된 block size에 대해 number of sets와 Associativity의 변화가 cache의 성능에 어떠한 영향을 미치는지 조사하며, 고정된 Associativity에 대해 number of sets와 block size의 변화가 어떠한 영향을 미치는지 조사하고, 고정된 number of sets에 대해 Associativity와 block size가 어떠한 영향을 미치는지 조사한다. 그리고, 이 결과를 바탕으로 이러한 요소들이 cache의 성능에 어떻게 영향을 미치는지에 대해 분석한다.