Jump to content

    
Sign in to follow this  
Strob

Vitis HLS и вектор на входе функции

Recommended Posts

Добрый день коллеги.

Потратил уже кучу времени на пустяковую казалось бы проблему. Решения адекватного до сих пор не нашел.

Был vivado hls, была в нем описана функция с вектором на входе. Чтобы грузить весь вектор сразу, параллельной шиной, использовалась директива array_reshape. Все логично, все просто.

Берём vitis hls, и облом. Читаем доки, читаем варнинги. Array_reshape не поддерживается для входов. Витис упрямо лепит интерфейс памяти. Никакой альтернативы для получения того же результата найти не смог. Точнее альтернативы есть, но они скорее нагромождение костылей. Неужели теперь с этим жить? Или я что-то упускаю?

Share this post


Link to post
Share on other sites
On 9/17/2020 at 11:03 AM, Strob said:

Добрый день коллеги.

Потратил уже кучу времени на пустяковую казалось бы проблему. Решения адекватного до сих пор не нашел.

Был vivado hls, была в нем описана функция с вектором на входе. Чтобы грузить весь вектор сразу, параллельной шиной, использовалась директива array_reshape. Все логично, все просто.

Берём vitis hls, и облом. Читаем доки, читаем варнинги. Array_reshape не поддерживается для входов. Витис упрямо лепит интерфейс памяти. Никакой альтернативы для получения того же результата найти не смог. Точнее альтернативы есть, но они скорее нагромождение костылей. Неужели теперь с этим жить? Или я что-то упускаю?

Для начала давайте разберёмся с терминами.

Vitis HLS - это что ? Вы пытаетесь сделать kernel для OpenCL на HLS, так ?  Или что-то другое ?

Share this post


Link to post
Share on other sites
On 9/23/2020 at 11:27 AM, dsmv said:

Для начала давайте разберёмся с терминами.

Vitis HLS - это что ? Вы пытаетесь сделать kernel для OpenCL на HLS, так ?  Или что-то другое ?

Нет, я пытаюсь сделать ip для использования в проекте vivado. При создании проекта витис позволяет выбрать, ip vivado flow или vitis flow. Насколько я понимаю при выборе ip vivado flow, конечной точкой создания ip будет корка для вивады.

Если вопрос по существу задачи, то обсуждение можно упростить до примера, имеем массив 4 fixed point на входе, хотим домножать их на второй вход, где 1 fixed point. Результат выдаём массивом.

Вообще на данный момент проблема была решена, совершенно дурацким образом. Оказалось что vivado hls не был выпилен из витиса, однако его наличие нигде не озвучивается явно и создаётся впечатление что в будущих релизах его таки выпилят.

Edited by Strob

Share this post


Link to post
Share on other sites

А по простому вам совсем ни как - обязательно писать какие то спецкоманды. Я делаю проще - ввожу данные стримом нужной ширины, разбираю на числа в обрабатываемом формате, делаю необходимые операции и собираю результат опять в один стрим. Выглядит может и не так красиво, но зато работает и переносится из версии в версию без проблем. Простой пример - комплексное умножение после ффт с плавающей точкой - в 1 такт 1 пару комплексных чисел не перемножить на нужной частоте - хлс синтез выдает что не успевает по времени - расширяю данные до 4х штатным ip width converter и 4 комплексные умножения за 4 такта уже делаются без проблем (не путаем II с латентностью). Если дальше нужно получить поток по 1 комплексному числу на такт ставлю еще один wc. Из минусов такого решения это размер ядра и ресурсы, но с другой стороны решение получается простым и надежным, а по сравнению с размером ядра ффт все остальные ядра нервно курят.

Edited by fguy

Share this post


Link to post
Share on other sites
2 hours ago, fguy said:

А по простому вам совсем ни как

То что вы описали, это я считаю костылем. Фактически вручную реализовывать функционал, который в vivado hls поддерживался из коробки, ну, по мне так странно.

По сути есть директива, которая всегда работала, а теперь перестала. Зачем это было нужно и кому?

Edited by Strob

Share this post


Link to post
Share on other sites
50 минут назад, Strob сказал:

То что вы описали, это я считаю костылем.

Я и сам про это написал, но этот примитивный код работает и чаще всего нормально переносится из старой версии хлс-а в новую.

Я работаю с хлс-ом начиная с первых версий (2014.2). За это время там была сделана куча изменений и не всегда приятных и не всегда анонсированных. Так что тут нужно самому следить за ключевыми фишками. Например после 2018.3 испортили синтез брам-интерфейса и не смотря на признание ошибки на форуме оффсайта исправлять ее не спешат. Где то с 2018 версий убрали поддержку записи даже во внутренний брам-массив по диапазону бит - возможно ваша проблема как то связана с этой "фишкой".

Результатом синтеза являются не только соблюдение II и латентность, но и выполнение заданного периода (частоты работы). А здесь будут уже варианты в зависимости от чипа и частоты. Так же "удачный" синтез не всегда гарантирует адекватную работу полученного ядра в чипе и искать такие ошибки гораздо сложнее чем свои.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this