|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
||||||
Ettus UHD (USRP Hardware Driver). Работа с кольцевым буфером10.09.2025, 11:24. Показов 4987. Ответов 16
Метки нет (Все метки)
Доброго времени суток, уважаемые форумчане. Возник такой вопрос, что сам я не очень понимаю даже как начать думать чтоб додуматься почему так происходит.
Преамбула такая: есть сервер с двумя Intel Xeon Gold 5415+, 256GB RAM и двумя сетевухами Intel XL710 PCIe x8 10 Gigabit Quad-Port - то есть 4 порта по 10GB каждый. Сервер работает с девайсами которые дают сетевой поток (в максимуме) 153.6e6 x 8 x 4 = 4915200000 байт, собственно этот поток надо прочитать (записать в RAM) для дальнейшей обработки. Для работы с устройством используется драйвер Ettus UHD (USRP Hardware Driver) родной для этих девайсов предоставляющий набор инструментов для обнаружения устройств, установки параметров и, собственно, чтения/передачи данных. В частности драйвер предоставляет объект потока через который вызывается функция чтения данных из потока. Собственно непонятка вот в чем:
который будет перекладывать данные из короткого буфера в основной, но (!!!) будет ли это работать (в натуре пока не эксперемнтировал) по-хорошему нужно (да и в принципе хочется) понять почему так происходит: какая разница передаю я в recv все партиции или только 16? При этом при увеличении количества партиций (более 64) или при увеличении размера партиции (более 2e+12) снова появляется переполнение.
0
|
||||||
| 10.09.2025, 11:24 | |
|
Ответы с готовыми решениями:
16
Работа с кольцевым буфером Очередь с кольцевым буфером Создание и работа с кольцевым списком |
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
|
| 11.09.2025, 10:18 | |
|
Когда вы делаете один большой вызов recv(), драйвер пытается обработать все данные сразу и буфер переполняется. Частые вызовы recv() не дают переполняться буферу + сетевая карта чаще генерирует прерывания и ядро ОС чаще планирует ваш поток.
0
|
|
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
|
| 11.09.2025, 12:16 [ТС] | |
|
andrey_f, если бы так, вариант №2 работал бы лучше чем вариант №1, а он работает также.
0
|
|
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
|
| 11.09.2025, 12:37 | |
|
Вы передаете все партиции, скорее всего драйвер обрабатывает их как единый большой запрос, что приводит к тем же проблемам, что и с первым вариантом.
0
|
|
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
|
| 11.09.2025, 13:30 [ТС] | |
|
andrey_f, возможно, тогда драйвер должен где-то в недрах условно "склеивать" адреса, исходники драйвера открыты, но расковырять что там на самом низком уровне происходит трудновато: вариантов устройств множество и функция чтения множество раз переопределена, однако видно что в конечном итоге драйвер получает буфер как указатель на указатель на void и, теоретически, может их как-то кешировать. Однако сейчас у меня рабочий вариант такой что каждый нексус (звено кольцевого буфера) выделяется отдельным небольшим куском (4 канала по 2000 сэмплов) нексус передается в recv целиком и до 80 нексусов в кольце работает стабильно, от 96 и выше начинаются проблемы. Память выделяется динамически, так что "законных" способов её склеить нет, хотя не увидев в исходниках драйвера как именно он формирует запрос к сетевым буферам точно сказать ничего не могу, возможно внутри он перезарзмечает буферы под свои нужды, но на уровне описания и внешних интерфейсов не предъявляет никаких требований к разбивке, лишь в примерах идущих в комплекте с драйвером есть использование функции
virtual size_t uhd::rx_streamer::get_max_num_samps(void) const = 0
0
|
|
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
||
| 11.09.2025, 14:13 | ||
|
Драйвер работает с DMA-буферами сетевой карты. Каждый вызов recv() соответствует одному или нескольким DMA-транзакциям. Сетевая карта имеет ограниченное количество дескрипторов DMA (обычно 1024-4096 (по данным Google)). Каждый буфер, передаваемый в recv(), требует одного или нескольких дескрипторов.
Добавлено через 24 минуты Как вы память выделяете для всего этого? Каждый раз запрос к аллокатору делаете?
1
|
||
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
|||||||||
| 11.09.2025, 14:35 [ТС] | |||||||||
0
|
|||||||||
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
||||||||
| 11.09.2025, 14:49 | ||||||||
|
У вас сколько дескрипторов на текущий момент?
Добавлено через 4 минуты
1
|
||||||||
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
|||||||||||||||||||
| 11.09.2025, 15:07 [ТС] | |||||||||||||||||||
0
|
|||||||||||||||||||
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
||||||||||||||||||||||||
| 11.09.2025, 15:53 | ||||||||||||||||||||||||
Добавлено через 23 минуты
1
|
||||||||||||||||||||||||
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
|||||||||||||||
| 11.09.2025, 16:41 [ТС] | |||||||||||||||
0
|
|||||||||||||||
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
|||||||||||||||||
| 12.09.2025, 09:50 | |||||||||||||||||
0
|
|||||||||||||||||
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
||||
| 12.09.2025, 10:33 [ТС] | ||||
|
nofile и stack - заметного эффекта не дали. pipe size изменить не могу В общем на текущий момент получается успешно вычитать 80 нексусов по 2000 сэмплов - не бог весть что, но с этим уже можно работать, спасибо andrey_f, если будут еще направления куда копнуть, буду очень спасибо
0
|
||||
|
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
|
|
| 12.09.2025, 10:42 | |
|
0
|
|
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 869
|
|
| 12.09.2025, 11:23 | |
|
Если в вашем коде вариант номер три работает то зачем вы вообще в драйвер и настройки полезли? Скормили бы другие буферы.
0
|
|
|
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,694
|
||
| 12.09.2025, 12:15 [ТС] | ||
|
0
|
||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 869
|
|
| 12.09.2025, 14:10 | |
|
ОС,если не указано ничего специального, выделяет адресное пространство, а дальше постранично идёт отображение лигичекого адреса на физический. Только на уровне ядра ОС можно выделить нужный блок памяти - линейный, непрерывный с фиксированным положением в памяти - чтобы железка через ПДП могла туда писать. Этим драйвер и занимается.
когда вы выделяете память через malloc - вы получаете двойную буферизацию. сначала железка передаёт в блок памяти внутри ядра, а потом процессор копирует это в вашу память. при этом после malloc никаких гарантий что физическая память была выделена - могло быть выделено только адресное пространство, а ос по мере обращения будет выделять страницы. так что при первом обращении к выделенной памяти могут быть небольшие затыки. обычно на глаз это не заметно. а у вас может и вообще тройная буферизация - ибо USRP Hardware Driver это же не драйвер сетевухи, а прослойка между сетевым стеком ОС и вашей программой. может там своих буферов полно )) Также при работе с аппараратурой может быть куча требования по страничному выравниванию буферов. так что память выделяется заранее, чтобы она была доступна, а не лениво выделялась. и в процессе работы никакого динамического выделения/освобождения. я бы начал с исследования затыков - если они есть, причины, где узкие места и прочее.
0
|
|
| 12.09.2025, 14:10 | |
|
Помогаю со студенческими работами здесь
17
Ошибка - Driver not loaded Driver not loaded QODBC (MS SQL SERVER) . Driver not loaded Driver not loaded QSqlError("", "Driver not loaded", "Driver not loaded")
Кольцевой буфер Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|