PCI-X와 PCI Express는 Relaxed Ordering을 지원합니다. PCI 시절에는 아주 엄격한 순서 규칙(Strict-Ordering Rule)이 있었습니다. PCI에서는 먼저 시작된 트랜잭션이 먼저 끝나야 합니다. 따라서 A라는 트랜잭션과 B라는 트랜잭션이 의존성이 없어서 병렬적으로 수행 가능한 경우라고 하더라도 반드시 직렬화가 되어야만 했습니다.
PCI Express에서는 TLP (Transaction Layer Protocol) 헤더의 Relaxed Ordering 속성을 1로 설정하면 이 기능을 사용할 수 있습니다. 이렇게 설정된 메모리 쓰기 트랜잭션은 이미 호스트 브릿지에서 큐에 걸려있는 다른 메모리 쓰기 트랜잭션보다 먼저 완료될 수 있습니다. 이 트랜잭션에 앞서 실행된 트랜잭션들보다 먼저 끝날 수 있느냐 없느냐 라고 생각하면 됩니다.
당연히 Relaxed Ordering은 주의해서 사용해야 합니다. 가령 NIC의 경우 패킷 버퍼에 다 쓰고 난 다음에 패킷 디스크립터를 써야만, 드라이버가 디스크립터를 보고 패킷 버퍼를 봤을 때 완전한 내용을 볼 수 있을 것입니다. 이게 지켜지지 않으면 패킷 디스크립터 자체는 작으므로 버퍼 쓰기 작업보다 먼저 끝나버릴 것이고, 이 때문에 불완전하게 쓰여진 버퍼를 다루면서 문제가 발생하게 됩니다.
인텔 GBE는 아래의 경우 Relaxed Ordering을 이용해서 성능을 최적화 할 수 있습니다. (CTRL_EXT 레지스터 RO_DIS 비트):
PCI Express에서는 TLP (Transaction Layer Protocol) 헤더의 Relaxed Ordering 속성을 1로 설정하면 이 기능을 사용할 수 있습니다. 이렇게 설정된 메모리 쓰기 트랜잭션은 이미 호스트 브릿지에서 큐에 걸려있는 다른 메모리 쓰기 트랜잭션보다 먼저 완료될 수 있습니다. 이 트랜잭션에 앞서 실행된 트랜잭션들보다 먼저 끝날 수 있느냐 없느냐 라고 생각하면 됩니다.
당연히 Relaxed Ordering은 주의해서 사용해야 합니다. 가령 NIC의 경우 패킷 버퍼에 다 쓰고 난 다음에 패킷 디스크립터를 써야만, 드라이버가 디스크립터를 보고 패킷 버퍼를 봤을 때 완전한 내용을 볼 수 있을 것입니다. 이게 지켜지지 않으면 패킷 디스크립터 자체는 작으므로 버퍼 쓰기 작업보다 먼저 끝나버릴 것이고, 이 때문에 불완전하게 쓰여진 버퍼를 다루면서 문제가 발생하게 됩니다.
인텔 GBE는 아래의 경우 Relaxed Ordering을 이용해서 성능을 최적화 할 수 있습니다. (CTRL_EXT 레지스터 RO_DIS 비트):
- 이더넷 컨트롤러가 디스크립터나 데이터를 읽어오는 경우 사용합니다. CPU가 이더넷 컨트롤러에 데이터를 쓰는 경우, 다른 쓰기 작업과 관련이 없으니 순서 제약을 받을 필요가 없습니다.
- 이더넷 컨트롤러가 메모리에 데이터 쓰기 작업을 하는 경우, 역시 다른 시스템 메모리 작업과 관련이 없습니다. 어차피 연관된 디스크립터 쓰기가 완료되기 전에는 드라이버가 이 데이터를 처리할 수 없습니다.
- 이더넷 컨트롤러가 디스크립터 쓰기 작업을 하거나 MSI (Message-Signaled Interrupt) 쓰기 작업을 할 때는 사용할 수 없습니다.
썬 스팍 엔터프라이즈 M 클래스 서버 이야기를 참조하시기 바랍니다.




덧글