link700 link701 link702 link703 link704 link705 link706 link707 link708 link709 link710 link711 link712 link713 link714 link715 link716 link717 link718 link719 link720 link721 link722 link723 link724 link725 link726 link727 link728 link729 link730 link731 link732 link733 link734 link735 link736 link737 link738 link739 link740 link741 link742 link743 link744 link745 link746 link747 link748 link749 link750 link751 link752 link753 link754 link755 link756 link757 link758 link759 link760 link761 link762 link763 link764 link765 link766 link767 link768 link769 link770 link771 link772 link773 link774 link775 link776 link777 link778 link779 link780 link781 link782 link783 link784 link785 link786 link787 link788 link789 link790 link791 link792 link793 link794 link795 link796 link797 link798 link799 link800 link801 link802 link803 link804 link805 link806 link807 link808 link809 link810 link811 link812 link813 link814 link815 link816 link817 link818 link819 link820 link821 link822 link823 link824 link825 link826 link827 link828 link829 link830 link831 link832 link833 link834 link835 link836 link837 link838 link839

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

PCI Express

Передача пакетов и пропускная способность соединения

Пакеты TLP, с помощью которых выполняются транзакции, поступают на канальный уровень. Основная задача канального уровня — обеспечить надежную доставку пакетов TLP. Для этого канальный уровень при передаче обрамляет пакет TLP своим заголовком, содержащим 12-битный последовательный номер TLP, и 32-битным полем LCRC (CRC канального уровня). Таким образом, канальный уровень к каждому пакету TLP добавляет 6 байт накладных расходов. На каждый пакет TPL передатчик должен получить положительное подтверждение Ack — пакет канального уровня DLLP (Data Link Layer Packet). Если подтверждение не приходит, то механизм таймаута заставляет передатчик повторить посылку пакета. Предусмотрен и пакет отрицательного подтверждения Nak, вызывающий повторную передачу без ожидания.

Пакеты DLLP имеют длину 6 байт: 4-байтная информационная часть и 16-битный CRC-код. Кроме подтверждений TLP пакеты DLLP используются для управления потоком, а также для управления энергопотреблением связи.

Физический уровень вводит свое обрамление передаваемых пакетов: перед началом пакета передается специальный символ STP (для TLP-пакета) или SDP (для DLLP-пакета), после пакета — символ END. Эти специальные символы отличаются от символов, представляющих данные после кодирования 8B/10B.

Рассмотрев структуры пакетов, можно оценить «скорострельность» базового соединения PCI Express (разрядность 1 бит, скорость 2,5 Гбит/с). Возьмем самую короткую транзакцию — запись двойного слова в пространство ввода/вывода. Соответствующий пакет TLP имеет длину 4 DW (3DW заголовок и 1 DW данных) — 16 байт; на канальном уровне к нему добавится 6 байт, так что на кодирование 8B/10B поступит 22 восьмибитных символа. К ним добавятся еще 2 символа обрамления физического уровня — итого 24. В линию будет передано 24×10 = 240 бит, что при скорости 2,5 Гбит/с займет 96 нс канала прямого направления. Вспомним, что транзакция записи в порт требует подтверждения — встречного пакета TLP длиной 3DW, который после канального и физического обрамлений вырастет до 20 символов — 200 бит, занимающие 80 нс встречного канала. Теперь учтем канальные пакеты подтверждений приема каждого TPL (6-байтные Ack) — с физическим обрамлением по 8 символов (80 бит). Они в каждом канале займут по 32 нс. Итак, в прямом канале транзакций записи в порт занимает 96 + 32 = 128 нс (0,128 мкс), в обратном — 80 + 32 = 112 нс. Если подсчитать максимальную скорость передачи данных при непрерывных записях в порт, получаем V = 4/0,128 = 31,25 Мбайт/с. При этом будет занят и встречный канал с коэффициентом загрузки 112/128 = 0,875. Результат по скорости близок к возможностям стандартной шины PCI (32 бит/33 МГц), в которой такая транзакция потребует четырех тактов шины. Чтение ввода/вывода на PCI Express даст те же результаты (на PCI результат будет хуже из-за «лишнего» такта на «пируэт»).

Теперь возьмем самый выгодный (в состязаниях по производительности) вариант транзакции: запись в память пакета 1024 двойных слов (с короткой 32-битной адресацией). Для этого требуется лишь один пакет TPL (транзакция завершения не требуется) длиной (3 + 1024) двойных слова = 4108 байт. К нему на канальном и физическом уровнях добавится 6 + 2 = 8 символов, что составит 4116×10 = 41160 бит ≈ 16,5 мкс. При этом скорость передачи данных составляет 4096/16,5 ≈ 248 Мбайт/с — это уже уровень производительности PCI 32/66 МГц при длинных пакетных передачах. Загрузка встречного канала подтверждениями канального уровня в этом случае пренебрежимо мала. Скорость чтения из памяти будет немного ниже, поскольку каждая транзакция чтения состоит из двух пакетов TLP — запроса чтения (3 или 4 двойных слова) и пакета завершения с данными длиной (3 + N) двойных слова. При большой длине пакета относительная доля дополнительных трех DW будет невеликой.

Если встречный канал удается загрузить полезным трафиком, то можно говорить об удвоении пропускной способности PCI Express за счет возможности работы в полном дуплексе. Однако в примере с записью в порт ввода/вывода о таком удвоении речи быть не может, поскольку встречный канал загружен довольно плотно. Если пересчитать полезную скорость на один сигнальный контакт разъема, то в самом выгодном полнодуплексном варианте получим 248×2/4 = 124 Мбайт/с на контакт. Для сравнения можно взять вариант PCI-X533, обеспечивающий пиковую скорость записи, приближающуюся к 533×4 = 2132 Мбайт/с. В операциях чтения памяти PCI-X выглядит гораздо скромнее — пиковая скорость всего 533 Мбайт/с. При этом используется около 50 сигнальных контактов (не считая многочисленных земляных), так что на каждый контакт приходится примерно по 10–40Мбайт/с. В порте AGP при той же пиковой скорости сигналов еще больше, так что заявления о высокой эффективности использования контактов в PCI Express имеют под собой основу. Полный дуплекс ни в PCI/PCI-X, ни в AGP невозможен.

Напомним, что данные подсчеты производились для базового соединения (x1, 1 линия); увеличив число линий до 32 бит (x32), можно получить максимальную скорость записи в память 248×32 = 7936 Мбайт/с. А если брать полную загрузку полнодуплексного соединения, то PCI Express может обеспечить суммарную пропускную способность 15872 Мбайт/с. Таким образом, в самом мощном варианте PCI Express оставляет далеко позади порт AGP с его пиком 2132 Мбайт/с. Правда, говорить о малом числе контактов уже не приходится — канал PCI Express x32 требует 2×2×32 = 128 сигнальных контактов (в AGP их меньше).