Передача пакетов и пропускная способность на примере интерфейса PCI Express 1.0
Уровень транзакций формирует пакеты TLP, в которых содержатся код команды, адресная информация, данные и некоторые другие поля. Для обеспечения надежной доставки пакетов TLP канальный уровень при передаче снабжает их своим заголовком, содержащим 12-разрядный последовательный номер TLP, и 32-разрядным полем LCRC (CRC канального уровня). Таким образом, канальный уровень к каждому пакету TLP добавляет 6 байт накладных расходов. На каждый пакет TLP передатчик должен получить положительное подтверждение Ack — пакет канального уровня (DLLP). Если подтверждение не приходит, то механизм тайм-аута заставляет передатчик повторить посылку пакета. Предусмотрен и пакет отрицательного подтверждения Nak, вызывающий повторную передачу без ожидания.
Физический уровень вводит свое обрамление передаваемых пакетов: перед началом пакета передается специальный символ STP (для TLP-пакета) или SDP (для DLLP-пакета); после пакета — символ END. Эти специальные символы отличаются от символов, представляющих данные после кодирования 8В/10В.
Рассмотрев структуры пакетов, можно оценить пропускную способность (производительность) базового соединения интерфейса PCI Express 1.0 (1 разряд, скорость — 2,5Г бит/с).
Самая короткая транзакция — запись двойного слова в пространство ввода-вывода — в прямом канале транзакций записи в порт занимает 128 нс (0,128 мкс), в обратном — 80 + 32 = 112 нс. Если подсчитать максимальную скорость передачи данных при непрерывных записях в порт, получаем v = 4/0,128 = 31,25М байт/с. При этом будет занят и встречный канал с коэффициентом загрузки 112/128 = 0,875. Результат по скорости близок к возможностям стандартного интерфейса PCI (32 разряда и 33 МГц), в котором такая транзакция требует четырех тактов интерфейса. Чтение портов ввода-вывода на интерфейсе PCI Express 1.0 даст те же результаты (на интерфейсе PCI результат будет хуже).
Теперь рассмотрим самый выгодный (в состязаниях по производительности) вариант транзакции: запись в оперативную память пакета из 1024 двойных слов (с короткой 32-разрядной адресацией). Здесь скорость передачи данных составляет 4096/16,5 = 248М байт/с — это уже уровень производительности интерфейса PCI (32 разряд и 66 МГц) при длинных пакетных передачах. Загрузка встречного канала подтверждениями канального уровня в этом случае пренебрежимо мала. Скорость чтения из оперативной памяти будет немного ниже, поскольку каждая транзакция чтения состоит из двух пакетов TLP — запроса чтения и пакета завершения с данными.
Если встречный канал удается загрузить полезным трафиком, то можно говорить об удвоении пропускной способности интерфейса PCI Express 1.0 за счет возможности работы в полнодуплексном режиме. Однако в примере с записью в порт ввода-вывода о таком удвоении речи быть не может, поскольку встречный канал загружен довольно плотно. Если пересчитать полезную скорость на один сигнальный контакт разъема, то в самом выгодном полнодуплексном варианте получаем 248 х 2/4 = 12М байт/с на контакт. Для сравнения можно взять вариант интерфейса PCI-X 533 МГц, обеспечивающий пиковую скорость записи, приближающуюся к 533х4 =2132М байт/с. В операциях чтения из оперативной памяти интерфейс PCI-X выглядит гораздо скромнее — пиковая скорость всего 533М байт/с. При этом используется около 50 сигнальных контактов (не считая многочисленных земляных), так что на каждый контакт приходится примерно по (10-40)М байт/с. В порту интерфейса AGP при той же пиковой скорости сигналов было еще больше, так что заявления о высокой эффективности использования контактов в интерфейсе PCI Express имеют под собой основу. Полнодуплексный режим работы в предыдущих интерфейсах PCI/PCI-X, AGP был невозможен.
Напомним, что данные подсчеты производились для базового соединения (xl, 1 линия); применив интерфейс х32 (32 линии), можно получить максимальную скорость записи в оперативную память 248 х 32 = 7936М байт/с. А если брать полную загрузку полнодуплексного соединения, то интерфейс PCI Express 1.0 может обеспечить суммарную пропускную способность 15872М байт/с. Таким образом, в самом мощном варианте интерфейс PCI Express 1.0 оставляет далеко позади порт интерфейса AGP с его пиком 2132М байт/с. Правда, говорить о малом числе контактов уже не приходится — канал интерфейса PCI Express х32 1.0 требует 2х2х32+ 128 сигнальных контактов (в интерфейсе AGP их меньше).