Добрый день.
Имеется самодельное PCI устройство без функций мастера (контроллер PCI — на ПЛИС Altera). Устройство имеет 32к памяти, которую необходимо читать (желательно быстро). Чтение я делаю в DPC (прерыванием устройство сообщает о готовности данных). Сделал несколько вариантов чтения: READ_REGISTER_BUFFER_ULONG (который в конце концов реализуется через rep movsd), через регистры MMX (movq/movntq), через регистры SSE (movaps), SSE + prefetcht0 (т.е. с кэшированием). Результаты следующие: чтение через MMX работает почти в 2 раза быстрее movsd, SSE — еще немного быстрее (процентов на 10), prefetcht0 ничего не дает. Кроме того, результаты на разных компьютерах отличаются. Скорость зависит от производительности компьютера и от того, через сколько мостов подключено устройство. В первом варианте (Pentium II, между устройством и процессором — только Host brige) среднее время чтения (movsd) — 4550 мс. В других вариантах — PIII, PIV и Athlon64 (устройство везде было подключено еще через 1 мост) скорости порядка 6000 — 9000 мс. Таким образом количество мостов играет решающее значение.
Итак, вопрос:
Можно ли ускорить скорость чтения?
Насколько я понимаю, большинство мостов PCI содержит механизм упреждающего чтения (кэширования), управляемый через регистры prefetchable memory base register и prefetchable memory limit register, в которые заносятся адреса начала и конца памяти, для которой разрешено упреждающее чтение. Кто ответственен за запись туда необходимых значений? Логично было бы если бы BIOS при загрузке или Windows делали это. Вероятно, сделать это несложно — в процессе перечисления PCI-устройств и распределения адресного пространства. У каждого блока PCI-памяти есть адрибут prefetchable, который указывает, можно ее кэшировать или нет (мои 32к можно). Можно было бы все prefetchable-области за мостом кинуть в одну область адресного пространства, а остальные — в другую. Однако этого, видимо, не происходит. Могу ли я самостоятельно туда что-то записать? Во что в таком случае мост будет превращать обычные PCI-команды "Memory Read" — "Memory Read Multiple" или "Memory Read Line"? Насколько я знаю, мое устройство "Memory Read Line" (чтение строки кэша) не поддерживает. Ну и prefetcht0 из-за этого вероятно не работает (а вообще prefetcht0 для PCI- памяти работает или нет?).
И еще: имеется ли возможность (и смысл) использовать системный контроллер DMA для PCI устройства? Транзакции будут 16-битными, но зато Memory Read Multiple может быть заработает? Ведь теоретичестая скорость 32бит@33МГц@32кБ — порядка сотен мкс, и даже если скорость будет в 2 раза меньше теоретической, то меня это устроит.
Заранее спасибо.
Здравствуйте, iFil, Вы писали:
F>Имеется самодельное PCI устройство без функций мастера (контроллер PCI — на ПЛИС Altera). Устройство имеет 32к памяти, которую необходимо читать (желательно быстро). F>...среднее время чтения (movsd) — 4550 мс. В других вариантах ...скорости порядка 6000 — 9000 мс.
Это получаются секунды что ли? Если это так, то, ИМХО, в сторону устройства копать нужно, т.к. тормозит оно.
Re: Чтение памяти PCI-устройства
От:
Аноним
Дата:
27.09.05 14:32
Оценка:
Здравствуйте, iFil, Вы писали:
F> В первом варианте среднее время чтения (movsd) — 4550 мс. F> В других вариантах — скорости порядка 6000 — 9000 мс.
мс это что — миллисекунды — тогда это слишком много.
Микросекунды тогда это слишком быстро...
И в том и в другом случае это похоже на аппаратные проблемы.
А данные вычитываются верные ?
И случаем это не АЦП ?
F>>...среднее время чтения (movsd) — 4550 мс. В других вариантах ...скорости порядка 6000 — 9000 мс.
D> Это получаются секунды что ли? Если это так, то, ИМХО, в сторону устройства копать нужно, т.к. тормозит оно.
Извиняюсь, не мс, а мкс. Чтение занимает единицы миллисекунд. В принципе скорость для данного устройства логичная, если все транзакции Memory Read размером в 1 двойное слово и с учетом задержки в мостах. При использовании ММХ и SSE вероятно транзакции получаются в 2 двойных слова.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, iFil, Вы писали:
F>> В первом варианте среднее время чтения (movsd) — 4550 мс. F>> В других вариантах — скорости порядка 6000 — 9000 мс. А>мс это что — миллисекунды — тогда это слишком много. А>Микросекунды тогда это слишком быстро...
А>И в том и в другом случае это похоже на аппаратные проблемы. А>А данные вычитываются верные ? А>И случаем это не АЦП ?
Это время в микросекундах, я ошибся. И это не быстро, а мееедленно. Хотелось бы раз в 5 — 10 побыстрее. При PCI DMA master скорость, думаю, возрастет минимум на порядок (Memory read multiplie будет использоваться и к тому же без участия процессора), но автор железяки пока мастера делать не хочет, говорит сложно очень.
А>А данные вычитываются верные ? А>И случаем это не АЦП ?
Да, это АЦП. Данные, вероятно, верные, хотя ко входам АЦП (их там 2) пока ничего не подключали, но средняя точка регулируется (там подстроечник на плате есть) и шумы вполне правдоподобные (я еще и графики рисую) и на пальчик реагируют.
Кроме того, там еще одна область памяти есть, на 16 байт (для управления и контроля) она совершенно точно читается и пишется правильно.