|
Оптимизация LwIP |
|
|
|
Feb 26 2010, 19:24
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Код struct pbuf *q, *pq; char* ptr; . . . ptr = pq->payload; for(q = p; q != NULL; q = q->next) { memcpy(ptr, q->payload, q->len); ptr += q->len; } . . . Данный код используется в LwIP для расположения содержимого буферов в памяти последовательно. На его выполнение затрачивается почти половина всего времени отправки UDP-пакета (0.14мс / 0.31мс). Для каждого пакета по 1484Б происходит две итерации. Возможно ли ускорить это действие (DMA) или как-нибудь обойти (например, заранее располагая буферы в памяти в нужном порядке) ? Спасибо. Железо: DK-NIOS-2S60N (StratixII), стандартная сборка Nios - Full featured.
Сообщение отредактировал Veg@ - Feb 26 2010, 19:33
|
|
|
|
|
Feb 27 2010, 09:57
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата(sergeeff @ Feb 27 2010, 01:43)  Почитайте здесь : http://old.nabble.com/Tunning-TCP-in-Lwip-td7158695.html. Там много советов по оптимизации параметров. Да, но большинство советов относится к оптимизации TCP и ответа на свой вопрос я также не нашел.
|
|
|
|
|
Feb 27 2010, 12:14
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата(sergeeff @ Feb 27 2010, 13:26)  А что не понятно? Если ваш UDP пакет уходит за две итерации, значит размер одного pbuf мал для его размещения целиком. По крайней мере, можно передавать за одну итерацию. Размер одного буфера 1536Б. И вообще, я думаю, не обязательно весь отправляемый пакет помещается в один буфер; возможно, он составляется из нескольких (напр., заголовки+данные).
|
|
|
|
|
Feb 27 2010, 12:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Veg@ @ Feb 27 2010, 15:14)  Размер одного буфера 1536Б. И вообще, я думаю, не обязательно весь отправляемый пакет помещается в один буфер; возможно, он составляется из нескольких (напр., заголовки+данные). Ну и чего вы тогда от lwip хотите? Раз вы не можете точно знать все лежит в одном буфере или вам надо раскрутить цепочку pbuf, значит кроме этого for-цикла вариантов нет. Может собака зарыта в вашем медленном memcpy? По крайней мере те memcpy, которые обычно в стандартных библиотеках находятся, мягко говоря, по скорости не ах.
|
|
|
|
|
Feb 27 2010, 19:22
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата если все равно медленно - тогда DMA Т.е. с DMA тоже свои определенные проблемы могут возникнуть или только реализация усложняется?
|
|
|
|
|
Feb 27 2010, 19:48
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 6-01-06
Из: Москва
Пользователь №: 12 876

|
Цитата(Veg@ @ Feb 27 2010, 22:22)  Т.е. с DMA тоже свои определенные проблемы могут возникнуть или только реализация усложняется? А под ниос нет контроллера ethernet, работающим в режиме DMA? т е чтобы он мог читать данные напрямую из памяти, минуя системную шину. У хилых ethrnet так можно сконфигурить.
|
|
|
|
|
Feb 28 2010, 03:00
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
Цитата(Veg@ @ Feb 28 2010, 01:22)  Т.е. с DMA тоже свои определенные проблемы могут возникнуть или только реализация усложняется? усложняется немного, но достаточно, чтобы задать вопрос о целесообразности LWIP(или о глубокой оптимизации последнего). так что там с побайтным копированием? самому интересно. вот еще ссылка на эту тему: http://forum.niosforum.com/forum/index.php?showtopic=5795Цитата А под ниос нет контроллера ethernet, работающим в режиме DMA? т е чтобы он мог читать данные напрямую из памяти, минуя системную шину. У хилых ethrnet так можно сконфигурить. проблема не в контроллере, они все в режиме DMA работают. поганое место - очередь пакетов и т.п., это все программно обруливается, и как показал топикстартер, довольно криво (медленно).
|
|
|
|
|
Feb 28 2010, 10:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(vadimuzzz @ Feb 28 2010, 06:00)  усложняется немного, но достаточно, чтобы задать вопрос о целесообразности LWIP(или о глубокой оптимизации последнего). так что там с побайтным копированием? самому интересно. вот еще ссылка на эту тему: http://forum.niosforum.com/forum/index.php?showtopic=5795проблема не в контроллере, они все в режиме DMA работают. поганое место - очередь пакетов и т.п., это все программно обруливается, и как показал топикстартер, довольно криво (медленно). На самом деле топикстартер ничего не показал, а только сказал, что цикл for() крутится довольно медленно (как ему кажется). Вопрос совсем в другом. Как этот самый for() отрицательно влияет на общую производительность приема/передачи по UDP? На сколько процентов падает реальная скорость? На 1%, 5%, 10%, 50%? За что бороться то? Уверен, что оптимизированная memcpy, для начала, покажет, что к чему.
|
|
|
|
|
Feb 28 2010, 10:21
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата(sergeeff @ Feb 28 2010, 02:55)  А что автор так уперся в оптимизацию цикла for(...)? Это что, самое узкое место в его проекте? Вероятнее всего. Цитата так что там с побайтным копированием? Благодарю за интерес. Сейчас временно этим вопросом не занимаюсь, отпишусь на след. неделе.
|
|
|
|
|
Feb 28 2010, 20:35
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата На самом деле топикстартер ничего не показал, а только сказал, что цикл for() крутится довольно медленно (как ему кажется). Почему кажется? Замеры производились с помощью Perfomance Counter; что в нем может быть неоднозначного?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|