'MESI'에 해당되는 글 1건
Cache coherence protocols :: 2009/11/13 20:04
헷갈리는 Cache coherence protocol에 대해 정리를 해 보았다.
0. Cache protocol에서 쓰는 cache block의 상태
- M(Modified) - 현재 cache block의 내용이 변경 되었다. (메모리와 다른 최근 버젼의 데이터를 가지고 있다.)
- O(Owned) - 현재 cache block의 내용이 변경된 최신 데이터를 가지고 있고, 다른 processor에서 현재 cache block과 같은 내용의 데이터를 shared 상태로 가지고 있다. (메모리와 다른 최근 버젼의 데이터를 가지고 있다.)
- E(Exclusive) - 현재 cache block은 현재 processor만 값을 가지고 있다.(내용은 변경되지 않았으므로 메모리의 내용과 같다.)
- S(Shared) - 현재 cache block의 사본이 다른 processor의 cache에 존재한다.
- I(Invalid) - 유효하지 않은 상태
- F(Forwarding) - Shared 상태와 같이 cache block의 사본이 다른 processor의 cache에 존재한다. Forwarding 상태가 있는 프로토콜에서는 하나의 읽기요청에 대해 shared 상태의 cache block은 응답을 보내지 않고, Forwarding 상태의 cache block만이 응답을 보낸다.

MEI의 단점
- Shared 상태가 없기 때문에 2개 이상의 processor에서 같은 데이터를 읽을 경우 cost가 크다.
2. MSI protocol
Shared 상태를 가지기 때문에 여러 processor가 같은 값을 읽을 경우 MEI보다는 나은 성능을 보여준다.

- Exclusive 상태가 없기 때문에 하나의 processor에서 cache block이 read 될 경우라도 shared 상태가 된다. 그 후에 같은 cache block에 write가 온다면 shared 상태이기 때문에 모든 processor에 invalidate를 날려야 한다.
3. MESI protocol
MSI에서 E가 추가 되어서 MSI의 단점이 보완된다. 일반적인 programming model에서 하나의 변수를 읽어서 새로운 값으로 업데이트 되는 일이 빈번하므로 좋은 성능을 보여준다.

MESI는 일반적으로 좋은 성능을 보여주나 특수한 상황에 대해 좀더 나은 성능을 보이기 위해 MOESI와 MESIF protocol이 제안되었다.
4. MOESI protocol
MESI 에 O(Owned)상태를 추가한 프로토콜이다. Modify한 cache block을 다른 processor에서 읽고자 한다면 MESI에서는 Modify된 cache block의 데이터를 메모리와 요청한 processor로 보내고 shared상태로 변경을 해 준다. 하지만 MOESI에서 Modify한 cache block을 다른 processor에서 읽고자 한다면, Modify된 cache block을 Owned 상태로 변경시키고 메모리에는 데이터를 보내지 않은 상태로 요청한 processor에만 데이터를 보낸다. Owned상태로 설정된 cache block은 메모리에 반영이 되지 않았으므로 언젠가는 메모리에 써야하지만, MESI처럼 다른 processor에서 read요청을 보낼 때 마다 메모리에 쓰지는 않는다. 즉, 쓸데없이 메모리 operation을 막아서 latency를 줄이는 protocol이다.
MOESI는 AMD 64bit architecture(Opteron)와 UltraSPARC에서 사용된다.

5. MESIF protocol
MESI에서 F(Forwarding)상태를 추가한 프로토콜이다. MESI에서 여러개의 shared 상태가 있는 cache block을 생각해 보자. 여기서 또 다른 processor가 같은 cache block을 읽기를 원한다면 그 cache block을 각각의 processor에게 요청을 하게 된다. 각각의 processor는 그 요청을 snoop하고 있다가 자신이 shared하고 있는 cache block에 대한 요청을 받게 되었으므로 그 cache block의 데이터를 요청한 processor에게 응답을 보내준다. cache block이 3개가 shared 되고 있었다면 각기 다른 3개의 processor로 부터 같은 데이터를 3번을 받게 된다. 이 경우 쓸데 없는 traffic이 발생하게 되므로 MESIF에서는 shared중 대표로 하나의 processor의 cache block을 F상태로 만든다. 그리고 F상태인 cache block만이 요청에 대해 응답을 하고, 나머지 shared 상태의 cache block은 요청이 와도 응답을 하지 않는다.
만약 forwarding상태의 cache block에 read요청이 온다면 그 cache block은 응답을 해 준 후에 shared상태가 되며, 그 응답을 받은 processor의 cache block이 forwarding상태가 된다. 이렇게 하는데는 2가지 이유가 있는데, 첫번째는 temporal locality이다. 즉, 새로 요청한 processor가 cache block을 좀 더 오래 가지고 있게 될 확률이 높기 때문이다. 두번째 이유는 특정 cache block에 요청이 몰리게 될 경우가 있는데, 이렇게 forwarding상태를 가지는 cache block의 위치를 계속 바꿔줌으로써, 이러한 요청이 각기 다른 node로 가게 하는 효과가 있다.
MOSIF는 Intel의 Nehalem architecture에서 사용된다. Intel에서 왜 MOESI를 채택하지 않고 MOSIF를 사용하였는지는 명확치 않다. MOESI와 MESIF 간의 성능 비교도 되지 않아서 어느 것이 더 성능이 좋은지는 모르겠다. 따라서 둘을 비교하는 것도 좋은 논문이 될 것 같다. =)
References:
http://meseec.ce.rit.edu/756-projects/spring2006/d3/7/Advanced%20Cache%20Coherency.pdf
AMD64 Architecture Programmer's Manual Vol 2 'System Programming'
http://www.realworldtech.com/page.cfm?ArticleID=RWT082807020032&p=5
제가 생각나는대로 정리하다가보니, 틀린 내용이 있을 수 있습니다. 잘못된 내용 있으면 지적해 주세요~
Trackback Address :: http://insidexino.net/trackback/2757340



