Search
Write a publication
Pull to refresh
194
0
Павел Локтев @EasyLy

TinyML, исполнение нейросетей на микроконтроллерах

Send message
Слов нет. Есть скриншот с иерархией подключения. Конфигурационное пространство — полностью идентично в рамках настроек. Собственно, в ответе на самый первый комментарий есть ссылка, где можно все дампы увидеть.

Мало того, три карты подключены к портам одного и того же моста. А поведение — разное.
Наконец-то до Зоркого Глаза дошло, что от него хотят. Зоркий Глаз — это я.

В документации на чипсет сказано:
Max Read Request Size (MRRS)—RO. Hardwired to 0.

В конфигурационном пространстве там действительно нули у всех портов. У всех — идентично.

Теперь смотрим этот же регистр у Марвеллов.

Там 0x2000. Это 0010000000000000
Интересующие нас биты 010 => 512 байт

Это значение у всех четырёх карт идентично. Короткий слот, длинный… Значения идентичны. Не найдём мы наверняка ничего тут. Я уже пытался… Всё идентично, а поведение — разное.
Критерий приемлемости, собственно, выходит за рамки темы. Статья создана, так как я отхватил проблемы, полез искать причины — а их нет нигде. Масса статей с ошибками, а путная — ну разве что тот AppNote от Xilinx. И тот — не по моей теме.

Вот, решил создать хотя бы что-то для тех, кто такое же огребёт. Чтобы знали, что это не у них ошибки, а вот такие приколы. Чтобы пробовали другие слоты. Чтобы пробовали другие материнки. А уж с комментариями — вообще много чего понять можно теперь. Намного больше, чем просто из статьи.

А так — для текущего этапа задачи всё решилось сменой материнки. А приемлемость чипа определяется наличием понятности его программирования напрямую через регистры. AHCI — открытый стандарт. Для SAS — там отдельная тема, но тоже ясно, куда двигаться. Просто не в рамках этой статьи.

Огромное спасибо за раскрытие физических деталей, которые могут влиять на это дело. Пусть все выкладки лежат вместе.
Именно чтобы откинуть этот вариант, производились только тесты записи. Данные писались в карты.
Мы пока не нашли контроллеры, которые бы работали в режиме третьего Express (и были бы приемлемыми по цене: AHCI — это всё-таки не топовая вещь, для топовой — есть на примете очень мощный SAS контроллер).

На какой материнской плате всё работает без тормозов во всех слотах — сейчас не скажу, её утащили. Но точно помню, что память у неё DDR4.

Главная цель написания статьи — просто предупредить программистов. Чтобы прикидывали реальные вещи, не надеясь на цифры из обзорных статей или из теории. Чтобы не пугались ограничений, не искали баги в коде, а проверяли бы то же, что у меня. В общем, цель — проинформировать. А чтобы таблицы составлять — это надо отдельную работу проводить. Может, кто заинтересуется и сделает.
Который барахлил — i5. Сейчас в этой материнке стоит i3 (других под рукой в нужном корпусе не было)
Машину под это дело специально выбирали помощнее. Не экономили. Собственно, сейчас взяли ещё более крутую, чтобы вопрос закрыть.
Да вроде, и под Windows всё видно, если правильными программами пользоваться.
Беда в том, что цифра 290 — не документирована нигде.
Ой, опечатка. Спасибо. Я как-то задумался про 8b/10b, но совсем забыл про скорость. Сейчас буду править.
Ну, собственно, статья — предостережение программистам. Чтобы имели это дело в виду. Я — несколько дней врага искал. Кто прочёл — меньше времени потратит.
Собственно, что делать — тоже теперь ясно. Надеюсь, кому-то сэкономит время.
Улучил минутку, проверил.
Три слота свободны. В «коротком» слоте торчит одинокая карта.
Лимит — всё те же 290.
Карты на Марвелловских чипах.
Запись данных — в режиме DMA, с использованием механизма Common Buffer (который выделяется при старте ОС). Во время теста, записи в этот Common Buffer сейчас не производится. Исходно — производилась (что несколько повышало нагрузку на процессор). Сейчас во время теста процессор показывает единицы процентов загрузки.

Программа при старте проецирует все регистры на свою память, затем — просто работает с оборудованием. Так что все программные нагрузки — минимальны. Прыжков в ядро и обратно — нет. Подготовили команду, заполнили указатель на Common Buffer, поехали гнать 4 мегабайта средствами контроллера. Закончили — делаем то же самое, но для следующего блока LBA…

Из того, что может мешать — драйвер ловит прерывания. Но я пробовал исключать их из работы. На поток — не повлияло.
Сейчас уже проверить не смогу, втыкая платы в отдельные слоты. Командировка подходит к концу, нет возможности спокойно вести опыты. Но по крайней мере, когда я вёл проверку — остальные слоты не были нагружены. Кто на скриншотах жёлтый — там идёт обмен. Остальные — пассивны, хоть контроллеры и воткнуты.
Используемые платы — все 1x. Беда в том, что в «коротких» слотах скорость ещё ниже, чем 1x. А в «длинных» — как раз соответствует ожидаемой от 1x.
Там ещё такое дело. ОС в работе почти не используется. Проекция регистров на память основной программы, дальше — программа сама всем рулит. ОС рулит прерываниями, но я отметил, что пробовал исключать их из работы. Скорости не изменились.
Целевые программа и драйвер жёстко завязаны на Windows. Причём (Заказчику виднее) на WIN7 x64. А подгонялась скорость именно под этот комплект «программа + драйвер». Первична была сдача комплекса…
Запускаем машину. Нагрузка 13%. Ничего не запущено. Причём это одно ядро почти на 50% нагружено.

Дальше — я деталей не помню. Я зимой разбирался. Нашёл на форумах ссылку на какой-то WDK инструмент (забыл имя), который собирает статистику, кто грузит процессор.
Запустил, пособирал. Выяснил, что драйвер USB постоянно в прерывание входит-выходит. Тогда успокоились, так как машина — стенд, который используется не так часто.

Озаботились только сейчас, разбираясь с причинами просадки скорости. После замены материнки, ничего не изменилось. После замены процессора, сразу после загрузки нагрузка на процессор 0%. Ни программные ни аппаратные вещи иные — не менялись.
Готовый четырёхканальный AHCI контроллер фирмы Marvell. Фирма — известная. Модель чипа — 9215, чип — тоже известный и популярный.

Данные гонял по 8192 сектора на команду. То есть, по 4 мегабайта в блоке.
Так взяли другую Intel материнку (более новую) — всё заработало на предельной скорости для 1x. Дальше уже чисто из спортивного интереса собрал снова старую и проверил на восьмиканальном контроллере, работающем в режиме 4x.
Век живи — век учись. Спасибо, что описали. Если возникнет подобное — будет уже готовое решение (с пятым SoC я пока не подружился, хотя уже несколько подходов сделал — пытаюсь понять, как там Bare Metal приложения делаются, но слишком много информации сразу — не хватает свободного времени, чтобы переварить).

Information

Rating
1,488-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity