Перейти к содержанию
    

dxp

Свой
  • Постов

    4 593
  • Зарегистрирован

  • Посещение

  • Победитель дней

    15

Весь контент dxp


  1. $cast - это типа dynamic_cast (в С++). Особенность: это одновременно и task, и function, зависит от контекста использования.
  2. Немного офтопик. Что "всё переделывать"? Весь дизайн? Почему? Зависит от контекста. Например: logic a; logic b; logic c; always_ff @(posedge clk) begin logic slon; ... slon = a && b; // вычисление значения локальной переменной ... c <= slon; end вполне легальный и годный подход. В этом примере код выхолощенный, он только для показать принцип. В реальном коде использование локальных переменных в блоках упрощает кодирование и улучшает читабельность. По правилам языка тут происходит усечение, поведение документированное стандартом и предсказуемое, никакого криминала тут нет. Сам предпочитаю писать logic slon = 1; вместо logic slon = 1'b1; которое выглядит загромождённым и менее читабельным. Как говаривал Б.Страуструп: "Это короче, чем я могу написать, а компилятор должен понимать умолчания". Это с чего это недопустимо для синтезатора? Очень даже допустимо: мы сообщаем синтезатору, что тут нам не важно, что будет, и он волен туда совать любое значение, как ему удобнее. Тем самым мы задаём более расслабленные условия для тула, что "развязывает" ему руки для оптимизаций.
  3. В общем виде: "Собрать устройство согласно схеме". Подходит, например, если нужно реализовать это на макетной плате. Если есть печатная плата, то тогда уж "Смонтировать ЭРИ на печатной плате в соответствии со сборочной документацией". В сборочную документацию входит сборочный чертёж, инструкции и т.п.
  4. Не понятно, почему именно ломалось. Если 64-разрядная модель памяти, то забить её всю, это надо очень постараться. По второй ссылке лечение с помощью какого-то патча. Т.е. пофиксили программно. Думается, на системе без MMU никакими патчами фрагментацию купировать не получится.
  5. Я некорректно выразился. Исправил. Вам известны случаи падения программ, например, на x86 из-за того, что фрагментация "побила" всю память?
  6. Физическая память выделяется страницами, а виртуальная "склеивается" из этих страниц. Если запрос не вмещается в промежуток свободного адресного пространства, то память выделяется в адресах, где достаточно места. А страницы физической памяти используются те же самые. Максимум что может грозить виртуальной памяти — то, что она (её адресное пространство) может закончиться. Но это контролировать гораздо проще.
  7. Фрагментация кучи на физической памяти — неустранимая проблема. Успешно она преодолевается при использовании виртуальной памяти — сиречь через MMU.
  8. Имена можно посмотреть в нетлисте (он обычно при открытом синтезированном проекте появляется в левой панели, где вкладка Sources) или в схематике — там можно встать на цепь и в контекстном меню вызвать свойства, в появившемся окошке (обычно тоже в левой панели снизу) можно увидеть все подробности.
  9. (1) Ваша балка длиной 4 м, сечение выбрал 80х40 мм (в больший размер в вертикальной плоскости), распределённая нагрузка от собственного веса 20 Н (2 кгс). (2) Эпюра изгибающего момента. Максимальное значение в точке защемления — 160 Нм. (3) Эпюра перемещений — максимальное перемещение логично на конце, 37.5 мм. Эта величина зависит от жёсткости балки, которая определяется геометрией и материалом. Геометрия указана выше, материал дерево (модуль упругости 10000 МПа). 4-метровая деревянная балка такого сечения — похоже на правду. Вообще, правильно сказали, что в таком простом случае не нужны никакие интегралы и сопроматы — нужно найти центр масс и приложить к нему результирующую силу. Центр масс тут, очевидно располагается в середине балки, т.е. плечо до него получается 2 м. А распределённая нагрузка пересчитывается в сосредоточенную силу, приложенную к этой точке, и сила эта равна в данном случае силе тяжести, действующей на балку — 8 кгс или 80 Н. Умножая, получаем: \(M_{y} = F \cdot l = 80 \cdot 2 = 160\text{ } Н\cdot m\)
  10. Обычно это входит в драйвер чипсета (часто и свичи в "южном" мосте). Енумерацию проходит, но корректно ли после этого работает — вот вопрос. Там может быть инициализация проходит на уровне стандартных действий, а конкретный свич требует ещё какие-то специфичные действия, которые обеспечивает проприетарный для этого компонента драйвер. По типу как с видеокартами — все они как-то обнаруживаются системой и что-то выдают. Но чтобы извлечь из видеокарты её настоящий потенциал, необходимо использовать специализированный драйвер для неё. Другие PCIe устройства в этом слоте исправно работают?
  11. А вы запрос по BDF делаете? Я всегда с адресами памяти работал. Свич по идее не должен влиять — при енумерации RC его должен обнаружить и запрограммировать на корректную маршрутизацию. И она же работает на два запроса. Со свичами дел не имел, не могу ничего сказать, может там и правда надо что-то со стороны драйвера настраивать, хотя это сомнительно. Всё же надо как-то локализовать проблему — где возникает. Вот ушёл второй запрос, что на RR порте? Он (порт) готов принимать запрос? Или может там уже после второго tready в нуле. Или, например, только на третьем затыкается. Или и после третьего не затыкается, но просто уже не проходит — ломается где-то дальше. По тому, что ругается на таймаут, похоже на то, что запрос где-то потерялся и ядро вернуло ошибку таймаута. Адреса (если по адресам запросы идут) посмотрите внимательно — корректные ли. На уровне TLP 32-разрядные запросы можно метать только в 32-разрядно-адресуемую память, а и 64-разрядные — в 64-разрядно-адресуемую. Хотя тут не TLP, а их проприетарный интерфейс. Но может есть какие-то нюансы. Не включен ли на хосте IOMMU, может он там вносит коррективы. Пока идеи кончились. 🙂
  12. Имхо, таймаут тут ни при чём. Он там достаточно большой и служит для того, чтобы терминировать запросы, на которые за вменяемое время не пришли ответы — чтобы запросы не висели вечно. У вас что-то ломается с логикой запросов — первые корректные, на них приходит, а потом что-то в них портится. Посмотрите внимательнее, что отсылаете. Попробуйте слать подряд несколько одинаковых запросов. Например, первый проходит, ещё раз его же. Если проходит, то ещё несколько раз. Если это работает, то по крайней мере покажет, что с буферами и очередями запросов проблем нет. А если на совершенно корректные запросы (ну, раз хотя бы один работает) дальше ломается, то тогда уже смотреть, что там с логикой транспорта — может кредитов выделено с гулькин нос и они не возобновляются (бредово, конечно, но кто знает, что там может быть). У вас тут не самая простая топология — коммутатор имеется, проблема может быть на любом уровне.
  13. Коммутатор, даже если ограничивает MPS ниже RC и дивайса, не должен влиять — при енумерации RC проверяет всю топологию, и если находит узел, который режет MPS — например, на 128 байт, то всем узлам в этой цепочке устанавливается MPS 128, несмотря на Capability. У вас, судя по скрину, свич не ограничивает. Что за тандемный ответ? Надо разбирать заголовок, чтобы понять, что там пришло.
  14. Согласен, что особого прироста ожидать не стоит, т.к. тактовые близки, у интола она даже выше. Имхо, тут рулит размер кэша, он и даёт основной прирост. Тот же рыжень с 4МБ кэша (со встроенной видюхой) и с 32МБ (без видюхи) дают разницу раза в полтора, если не больше, хотя ядро и память и материка одинаковые. Проводил сравнение Ryzen 5 3600x vs Core i5-8600K. Тож выигрыш был пользу рыженя процентов на 10-15, сборка проекта там шла порядка 30 минут. За счёт кэша, имхо (9МБ vs 32МБ).
  15. первым делом смотреть состояние потоковых портов — что с ними, готовы принимать-отправлять или tready в нуле. Например, если второе, то скорее всего почему-то затык внутри — кредиты кончились, например, по какой-то причине. Можно повесить счётчик и определить, сколько передано до зависания. Может там на первом же пакете всё падает.
  16. а нету доступа удалённого до хоста, с которого можно к ПЛИС прицепиться по JTAG?
  17. Так хост/железка вам не доступны? Если виснет гарантировано сразу, самое оно ILA подключить и посмотреть состояние PCIe ядра. 5GT/s -- это Gen2 дивайс?
  18. 256 — достаточно большой MPS, обычно такое на серверах, на настольных хостах как правило 128. Тут нет ошибки? Что lspci говорит про реальный MPS?
  19. Есть. Их обязательно использовать? А если сравнивать по этой теме, то надо на С реализовать тот же функционал и тогда сравнивать. И при чём тут велосипед и спорткар? Сколько сэкономить? В 2-4 раза или 10%?
  20. Любой профессиональный подход требует основательности, скрупулёзности и упорства. ЯП тоже является инструментом, который необходимо глубоко знать. И вложение в изучение ЯП, который является куда более универсальным инструментом, чем конкретный ассемблер, намного эффективнее. Ассемблер содержит кучу информации частного характера, которая за пределами конкретного процессора не пригодится. А тот же С является по сути портабельным макроассемблером, как тут уже сказали. Это очень низкоуровневая концепция, там просто неоткуда взяться большому оверхеду. И если в прежние времена ещё можно было отнести неэффективность на слабость (тупость) компилятора, то с развитием вычтехники стали появляться и оптимизирующие компиляторы (а это уже где-то вторая половина 1990-х), генерирующие код, обойти руками который было очень непросто. Я по молодости соревновался с IAR v1.40 для AVR, сам тогда пришёл от железа и ассемблера, и был сильно удивлён, что "тупая железка" (РС) генерит точно такие же инструкции, как я бы и сам написал. С этого и возник интерес к С (до этого считал его ЯП высокого уровня, куда, дескать, ему там в такие малыши как AT90S2313 и даже AT90S8515). Настройка опций компилятора делается обычно один раз (потом уже по месту что-то корректируется, если надо) и занимает очень незначительное время по сравнению с написанием кода. А то, что Borland лохматых версий пихал кучу лишнего, не может быть основанием для выводов об ущербности технологии. Кстати, и современные тоже нередко пихают кучу лишнего, просто щас на этого никто не смотрит — ресурсов стало вдосталь (памяти, дискового пространства). И только на ембедде приходится обращать на это сугубое внимание. Да и то далеко не везде (на ембеддед линуксах уже тоже мало кто заморачивается) — преимущественно это осталось в мире МК. * * * Соревноваться на уровне ассемблера вы можете достаточно эффективно на простых процессорах — 8/16-битниках типа AVR, MSP430, PIC. Когда перед вами дивайс вроде того же Blackfin, будете удивлены тому, какой код генерит компилятор: глядя на него в первый момент возникает мысль, что это какой-то наркоман писал — инструкции все поперемешаны. Но когда начинаете писать ровный (по-человечески чтобы выглядело) код сами, то прилетают сообщения о простое конвейера, что, де, вот это значение Р-регистра (регистр-указатель) не может быть использовано в следующей инструкции, т.к. оно не доехало до стадии Execute на конвейере, и т.п. и чтобы избежать простоя, перемещаете загрузку указателя раньше в потоке инструкций... И обнаруживаете, что начинаете писать такой же "наркоманский" код, где команды, составляющие связанную группу действий (например, чтение-изменение-запись переменной в памяти), начинают размазываться по коду и перемешиваться с командами из других групп действий. И тут доходит, что компилятор-то именно это всё и делает. Он "знает" про свойства конвейера процессора и пытается избежать простоев. Т.е. уже на старте компилятор обходит неподготовленного, знающего только ассемблер, человека. Чтобы дорасти до компилятора, тут нужна практика и опыт, который тоже нужно поддерживать. И обойти компилятор тут очень непросто. И даже писать такой перемешанный код тоже весьма утомительно, не говоря уже о его сопровождении. Это пример про относительно простой процессор, в котором просто длинный конвейер. А если взять современные суперскаляры с внеочередным исполнением инструкций и переименованием регистров, где на аппаратном уровне идёт загрузка нескольких вычислительных юнитов, где продвинутые предсказатели ветвлений и т.п., то прокачать владение ассемблером хотя бы до того уровня, который вложили компиляторописатели в инструмент, потребует просто жить в этом мире. А завтра выйдет процессор с другой, обновлённой микроархитектурой (ARM их плодит как горячие пирожки), и всё по-новой, изучать особенности поведения, экспериментировать, исследовать... Когда процессоров было три штуки на всё, в этом, возможно, и был какой-то смысл. В нынешнее время это просто непозволительное расточение времени и сил. При сомнительном результате.
  21. По существу сказать ничего не можете (примерами доказывайте кривизну С/С++ компиляторов), на личности перешли. Ожидаемо.
  22. Нету никаких 2-4 раз. С++ даёт ровно такой же оверхед как и С, а С проигрывает ассемблеру максимум 10-15%, и то смотря где и как. На современных больших процессорах ещё надо постараться написать код эффективнее компилятора: компиляторописатели знают особенности аппаратуры целевого процессора обычно получше рядового программиста, поэтому чтобы оный смог на асме написать эффективный код, надо потратить на это время. Никто в здравом уме этим давно не занимается — сейчас процессоры пекут быстрее, чем их успевают осваивать. А при оптимизации по размеру и на МК сложно конкурировать с хорошим компилятором — он делает неслабую работу по выявлению одинаковых кусков кода, организовывает это в подпрограммы, делает вызовы на них и т.п., руками это делать быстро устанешь. Т.ч. 10-15% в худшем случае. А то и наоборот на практике получается нередко. А если у кого-то бинарник раздуло всяким мусором, так просто надо уметь пользоваться инструментом. К языку и технологии это отношения не имеет.
  23. Это указывает на профнепригодность авторов С++ варианта, не более.
  24. Копайте глубже. Полностью коммерческая. Среди клиентов есть и бюджетные организации, т.к. альтернативы в РФ такого класса продуктов просто нет — прогажено так же как и микроэлектроника. Клиенты не указаны потому, что их очень много, напрямую работают только с очень крупными (типа Газпрома какого-нить), их перечислять смысла нет. Остальные работают через партнёрские организации (интеграторов), коих тоже немало.
×
×
  • Создать...