Цитата(dsmv @ Aug 12 2011, 15:14)

Я использовал ядро PLDA, и поэтому размер пакета от меня скрыт. Они используют максимальный размер 512 байт.
В новом контролере ядро PLDA не использую. Формирую запрос минимальный. И в итоге получил падение скорости на 11 %.
512 байт - скорость ПК->устройство 1080 Мбайт/с
128 байт - 957 Мбайт/с
Так что буду увеличивать количество байт в запросе до 512.
В этом вопросе необходимо внести ясность.
Под длиной пакета я имел ввиду пакеты в обратную сторону, то есть с устройства в хост.
В этом направлении от размера пакета практически ничего не зависит, так как паузу между пакетами можно сократить до минмума.
В направлении из ПК в хост всё немного сложнее.
Тут можно поступать двумя способами. Первый (простой) : посылаем запрос, ждём пока прилетят все данные по этому запросу, только после этого посылаем следующий запрос.
Естественно, на скорость тут влияет та самая пауза между посылкой запроса и появлением первых данных с хоста. По моим наблюдениям, она может составлять порядка 200 тактов шины.
Понятно, что в этом случае чем больше размер запроса, тем меньше относительное влияние этой неизбежной (на каждый запрос) паузы. Отсюда такая разница в скоростях.
Размер пакета с запросом на данные может быть любым, лучше конечно максимальным, хост сам разберётся и если надо, разобьёт большой пакет на мелкие куски.
Второй способ (более производительный и более сложный в реализации) : Посылаем один запрос, сразу же посылаем ещё один. Принимаем данные и следим (контролируя количество прилетающих с хоста данных) за тем, чтобы в очереди всегда было как минмум 2 запроса. В этом случае пауза между первым запросом и данными возникает всего один раз на всю операцию ДМА, соответственно влияние этой паузы "размазывается" на размер всей операции ДМА, и практически нулевое. Однако в этом способе тоже есть свои подводные камни. Дело в том, что хост контроллер не гарантирует того, что данные будут передаваться в девайс именно в том порядке, в котором их запрашивали, поэтому на границах пакетов довольно часто мелкие блоки данных от разных соседних запросов переставляются местами.
В принципе эта проблема тоже победима, так как у каждого запроса может быть свой уникальный ID, значит данные можно сначала собирать в промежуточную память размером в 2 пакета, и по получению всех данных от текущего пакета отдавать далее в конвеер обработки. Но это довольно серьёзное усложнение схемы, хотя в случаях когда нужно выжать максимальную производительность может быть оправдано.