Перспективы синтеза С++ в ПЛИС (иногда надо же сабж менять !)

Nov 22, 2005 1 Replies

Пpиветствую, Harry!



MT>> Тогда я не понимаю, зачем С++ синтез вообще ?



HZ> Во-первых, HDL - это подмножество языка. К примеру, тот же Верилог HZ> создавался как язык для моделирования. HZ> Во-вторых, Verilog/VHDL как средства для описания моделирующих HZ> процессов Спасибо, что лишний раз уточнил известные мне вещи :-D Про моделирование я обеими руками за SystemC (только вот времени заняться никак нет). Я ж именно про синтез спросил.



MT>> Имхо смысл в С синтезе будет, если синтез С будет уровнем выше, MT>> чем HDL. HZ> Он и есть выше. Именно _синтез_ ? Моделирование выше, это да.... А вот синтезируемое подмножество уже выше ?



MT>> То есть мы будем описывать не Hardware, как сейчас, а алгоритм.



HZ> А ты и сейчас не хардвару рисуешь, а задаешь описание поведенчески - HZ> пишешь процесс, который по событию производит какие-то действия. А HZ> конкретное железо уже после синтезатор рожает. Всё-таки сейчас я по HDL коду почти всегда могу сказать, как этот конкретный кусок кода будет выглядеть в железе. Или по крайней мере перечислить реально возможные варианты. HZ> Впрочем, я понял, что ты имеешь в виду. :) Во-во :-)



MT>> В идеале - например, чтобы из сишного алгоритма БПФ MT>> этот синтезатор генерил нам качественный аппаратный БПФ.



HZ> Фантазии, фантазии... :) Скорее мечты :-) HZ> Если проводить параллель с программированием, то это звучало бы так: HZ> пишешь в тексте программы, дескать, отфильтровать сигнал в HZ> полосе F, с неравномерностью D, шириной переходной полосы f и т.д. И HZ> пусть компилятор родит соответствующий код. :) А в чём проблема ? Matlab/Simulink в зубы :-) Будет тебе из него сишный код. Как раз на таком высоком уровне проблем нет. В схематике соединяем готовые библиотечные блоки. В данном случае берём библиотечный фильтр. Hо касательно железа я имел в виду всё-таки не совсем то. Хочется уровень выше голой цифры в виде сумматоров, шин и триггеров, но шире и универсальнее, чем библиотека готовых блоков. SystemC (синтезируемая часть) сейчас на уровне голой цифры. Мне же хотелось бы автоматического перевода _последовательного_ (программного) алгоритма в _параллельный_ (аппаратный). И мнится мне, что в принципе это возможно. AFAIK любой современный компилятор уже имеет средства например для разворачивания цикла for (если цикл удовлетворяет определённым требованиям) в параллельную конструкцию, эффективно выполняемую с помощью SIMD блоков процессора (MMX,SSE или там AltiVec). Вот и хотелось бы продолжить и углубить сей момент. Чтоб к примеру тот же for, написанный в программе, развернулся прямо в некий SIMD блок в ПЛИС :-) При арифметических операциях ставим или аппаратный блок (сумматор/умножитель/etc), или, если операций много, но занимают они мало места в программе, несколько библиотечных АЛУ с блоками управления. При вызове a=fft(b) просто ставим готовый аппаратный блок БПФ из некой стандартной библиотеки, автоматически настраивая его параметры по типам и кол-ву аргументов и результатов (типа Xilinx CoreGenerator, но в пакетном режиме). При обьявлении в программе массива ставим модули памяти нужной глубины и разрядности. В зависимости от числа операторов программы, лазающих по этому массиву, делаем её много- или однопортовой. Или ставим несколько банков. Если памяти надо очень много, спрашиваем юзера, а не подключить ли внешнюю SDRAM. При отрицательном ответе ругаемся и выходим, при положительном берём библиотечный блок интерфейса SDRAM и заодно делаем юзеру схему соединения SDRAM с нашей ПЛИС или ASIC. Hу и так далее. Я ещё много могу придумать. Как вширь (автоматически перерабатывать в железо разные операторы и типовые алгоритмы), так и вглубь (как эти аппаратные блоки автоматически потом увязать вместе). Тем более что неоднократно приходилось по имеющимуся алгоритму в виде программы на С делать железо. И закономерности в этом процессе есть. Правда, основная такова - при наличии рядом товарища, писавшего программу и знающего предметную область, дело значительно упрощается :-). А если в С++ ещё добавить некие средства явного параллелизма - вообще будет замечательно. Тем более что такие расширения для Си вроде есть. Вот и юзать их в синтезе. Поскольку я глупый, кто-то умный наверняка уже всё продумал и пытается сделать. Вопрос - ГДЕ ОHО ? HZ> Это задача глубокого (для ЭВМ) алгоритмического синтеза, HZ> с такими задачами пока что человек справляется HZ> несоизмеримо лучше. Тем не менее сишные компиляторы уже научились делать распараллеливание. Хорошо ли, плохо ли - но прогресс налицо. HZ> Т.ч. научить синтезатор рожать железо из HZ> абстрактного описания, наверное, можно, только вот качество HZ> реализации, думаю, тебя вряд ли устроит. Пока нету этого рожания. Мнится мне, что тут, как всегда, надо выбрать золотую середину. То бишь уменьшить степень абстракции исходной программы (==выделить синтезируемое подмножество), зато улучшить реализацию.



MT>> единственное преимущество которого в возможности быстрой адаптации MT>> обычного программера в железячника. HZ> Тоже нет. Для того, чтобы чел мог эффективно работать, ему придется HZ> разобраться в потрохах. Вот и я о чём. В системСи смысл на данный момент - моделирование.



HZ> Реальное же преимущество SystemC в том, что на нем проще описывать HZ> _сложные_ устройства. _Модели_ сложных устройств - но не _реальные_ устройства. Hо тут его поджимают MATLAB/Simulink и SystemView. Вот я и не понимаю ниши, в которую предназначен SystemC сейчас. Очень сложные системы имхо проще моделить в мышизме. Синтезируемые вещи отлично пишутся на HDL. Уже есть некоторые средства перехода от мышизма прямо к HDL (Xilinx System Generator и аналогичная штука у Альтеры). СистемСи имхо остаётся ууузенькая ниша между мышизмом и HDL. Причём средств перехода к HDL пока толком нет. HZ> Сейчас есть нечто под названием SystemVerilog Слышал такую букву. Меня в данный момент в моделировании больше интересует VHDL-AMS/Verilog-A. Пытаюсь приспособить к жизни. Как и совместное моделирование HDL+MATLAB. У этого на мой взгляд есть своя ниша - совместное _цифроаналоговое_ моделирование на поведенческом уровне. Ранее такое можно было делать только на уровне мелкой логики AFAIK (во всяких PSpice). А теперь уже на уровне алгоритма. HZ> Синплифай, к примеру, уже кое-что начал поддерживать. С какой версии ?



MT>> А в остальном - приходится самому думать, как абстрактный MT>> алгоритм эффективно переложить в реальность кусочка Si. HZ> Так это и есть основная задача, в которой машина не может заменить HZ> человека. И радуйся - если комп сможет это делать вместо тебя, ты HZ> останешься без работы. :) Hапугал :-) Рисую табличку "Will code HDL for FOOD" :-D



Michael Tulupov ...


Tue, 22 Nov 2005 03:16:44 +0300 Michael Tulupov wrote to Harry Zhurov:

MT>>> То есть мы будем описывать не Hardware, как сейчас, а алгоритм.

HZ>> А ты и сейчас не хардвару рисуешь, а задаешь описание поведенчески - HZ>> пишешь процесс, который по событию производит какие-то действия. А HZ>> конкретное железо уже после синтезатор рожает. MT> Всё-таки сейчас я по HDL коду почти всегда могу сказать, как этот MT> конкретный кусок кода будет выглядеть в железе. MT> Или по крайней мере перечислить реально возможные варианты.

Так это и есть хорошо! Если ты не можешь сказать, во что выльется то или иное описание после реализации его в железе некой тулзой, то полезность оной тулзы устремляется к нулю.

HZ>> Если проводить параллель с программированием, то это звучало бы так: HZ>> пишешь в тексте программы, дескать, отфильтровать сигнал в HZ>> полосе F, с неравномерностью D, шириной переходной полосы f и т.д. И HZ>> пусть компилятор родит соответствующий код. :) MT> А в чём проблема ? Matlab/Simulink в зубы :-) Будет тебе из него сишный MT> код.Как раз на таком высоком уровне проблем нет. MT> В схематике соединяем готовые библиотечные блоки. В данном случае берём MT> библиотечный фильтр.

Ага, а когда ты этот сишный текст подсунешь компилятору из VDSP или CCS, то скорость работы этого фильтра тебе вряд ли понравится. Полезность Симулинка с его приблудой для синтеза цифровых фильтров ограничивается возможностью генерации коэффициентов фильтра для выбранного типа и характеристик. Реализацию на DSP приходится (и это правильно) писать руками и на ассемблере. Конечно, существуют случаи, когда быстродействия хватает с запасом в два порядка, можно себе позволить не тратить время на возню с асмом. Только это не наш случай. :)

MT> Hо касательно железа я имел в виду всё-таки не совсем то. MT> Хочется уровень выше голой цифры в виде сумматоров, шин и триггеров, MT> но шире и универсальнее, чем библиотека готовых блоков. MT> SystemC (синтезируемая часть) сейчас на уровне голой цифры.

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

MT> Мне же хотелось бы автоматического перевода _последовательного_ MT> (программного) алгоритма в _параллельный_ (аппаратный).

Описание на SystemC отнюдь не такое последовательное, как в простой программе. Вернее оно - да, последовательное, но не в бОльшей мере, чем последовательность операторов в VHDL'ном процессе или Verilog'ом блоке. По сути до некоторой степени описание на SystemC можно представить как программу, работающую под управлением ОС - есть параллельно выполняемые процессы, есть средства синхронизации между процессами. На компе, кстати, оно так и работает - ядро SystemC как раз берет на себе функции по организации параллельности, а процессы - это треды ОС. И синхронизация производится с помощью вещей типа WaitEvent, NotifyEvent (за точность названий не ручаюсь, давно уже смотрел все это) и подобных.

MT> И мнится мне, что в принципе это возможно. MT> AFAIK любой современный компилятор уже имеет средства MT> например для разворачивания цикла for (если цикл удовлетворяет MT> определённым требованиям) в параллельную конструкцию, MT> эффективно выполняемую с помощью SIMD блоков процессора MT> (MMX,SSE или там AltiVec).

MT> Вот и хотелось бы продолжить и углубить сей момент. MT> Чтоб к примеру тот же for, написанный в программе, MT> развернулся прямо в некий SIMD блок в ПЛИС :-)

Это все есть. И давно. И на существующих HDL. Вот в этом же треде я приводил фрагмент кода (который Квартус отказался компилять, а Синплифай на ура) - арбитр контроллера памяти. Там как раз все описано в виде цикла. А в ПЛИСе оно реализовано в виде схемы, которая реализует описанную функциональность аппаратно. За один такт системного клока. И все такие вещи ессно есть и в SystemC, и в HandelC. Тут никакой революции нету.

MT> При арифметических операциях ставим или MT> аппаратный блок (сумматор/умножитель/etc), MT> или, если операций много, но занимают они мало места MT> в программе, несколько библиотечных АЛУ с блоками MT> управления.

Арифметика прекрасно синтезируется. Практически любым современным синтезатором.

MT> При вызове a=fft(b) просто ставим готовый аппаратный MT> блок БПФ из некой стандартной библиотеки, автоматически MT> настраивая его параметры по типам и кол-ву аргументов и MT> результатов (типа Xilinx CoreGenerator, но в пакетном MT> режиме).

Хе. А вот тут уже вопросы начинаются. Вот этот вызов - он что, за один такт должен выполняться? Или за сколько? Можно и за такт, если этот так порядка миллисекунд. Только вряд ли это кого-то устроит. Как тут быть? Ведь надо же взаимоувязать его работу с другими частями устройства. И по потреблению ресурсов, и по быстродействию. Т.е. опять надо руками и головой тут поработать.

MT> При обьявлении в программе массива ставим модули памяти MT> нужной глубины и разрядности.

Ага, когда этой памяти немеренно и она всякая-любая. А вот на Альтерах память бывает только блоковая. Для произвольного варианта блоков не напасешься. Т.ч. проектирование тут занимает очень важное место, никуда от него не деться. На любом языке.

MT> В зависимости от числа операторов программы, лазающих MT> по этому массиву, делаем её много- или однопортовой. MT> Или ставим несколько банков. Если памяти надо очень MT> много, спрашиваем юзера, а не подключить ли внешнюю MT> SDRAM.

Ага, и теряем на этом быстродействие на порядок и более (особенно при произвольной выборке). Опять пролет по основному параметру.

MT> Hу и так далее. Я ещё много могу придумать. MT> Как вширь (автоматически перерабатывать в железо MT> разные операторы и типовые алгоритмы), так и вглубь MT> (как эти аппаратные блоки автоматически потом увязать MT> вместе).

MT> Тем более что неоднократно приходилось по имеющимуся MT> алгоритму в виде программы на С делать железо. MT> И закономерности в этом процессе есть.

MT> Правда, основная такова - при наличии рядом товарища, MT> писавшего программу и знающего предметную область, MT> дело значительно упрощается :-).

Это понятно, что можешь придумать. Достаточно. Как видишь, во всех случаях на автомате оно не получится. И то, что имеется рост ресурсов кремния при той же цене не сильно меняет дело - ресурсы растут, но и задачи тоже растут.

Основная тенденция к упрощению использования и умощнению инструментария - это перекладывание на "железные" плечи компилятора большой по объему рутинной работы и поддержка компилятором специальных средств для декомпозиции большой задачи - разбивку ее на ряд более мелких и, как следствие, простых. Вот эти-то вещи и дает SystemC по сравнению с существующими HDL. Именно эти, а не пресловутую возможность посадить любого программера за хардверный дизайн. А то, что ты описывал - это вообще проектирование и алгоритмический синтез, это области, где ЭВМ с человеком соревноваться не может. Во всяком случае пока.

MT> А если в С++ ещё добавить некие средства явного MT> параллелизма - вообще будет замечательно. MT> Тем более что такие расширения для Си вроде есть. MT> Вот и юзать их в синтезе.

Так SystemC как раз их и включает. SystemC - С++ со специальной библиотекой, включающей кроме прочего, ядро, поддерживающее параллельное выполнение процессов, и методология использования этого хозяйства.

HZ>> Это задача глубокого (для ЭВМ) алгоритмического синтеза, HZ>> с такими задачами пока что человек справляется HZ>> несоизмеримо лучше. MT> Тем не менее сишные компиляторы уже научились MT> делать распараллеливание. Хорошо ли, плохо ли - MT> но прогресс налицо.

Это все низкоуровневые оптимизации. Это задача сама по себе значительно более простая, нежели проектирование. И даже тут им еще есть над чем поработать.

MT>>> единственное преимущество которого в возможности быстрой адаптации MT>>> обычного программера в железячника. HZ>> Тоже нет. Для того, чтобы чел мог эффективно работать, ему придется HZ>> разобраться в потрохах. MT> Вот и я о чём. В системСи смысл на данный момент - моделирование.

Основной - да, - моделирование сложных систем. А синтезом - подождем приличных синтезаторов. Там видно будет, стОит ли овчинка выделки.

HZ>> Реальное же преимущество SystemC в том, что на нем проще описывать HZ>> _сложные_ устройства. MT> _Модели_ сложных устройств - но не _реальные_ устройства. MT> Hо тут его поджимают MATLAB/Simulink и SystemView.

А ты в них можешь моделировать свое VHDL описание? Кроме того, при моделировании в том же Матлабе возникают проблемы, к примеру, с моделированием поведения, скажем, fixed-point арифметики. Сам Матлаб это нативно не поддерживает, у него все в даблах, а егонный тублокс как-то мне не показался. Уж лучше это прямо на С++ и писать. И ловить переполнения и прочие эффекты.

MT> Вот я и не понимаю ниши, в которую предназначен SystemC сейчас. MT> Очень сложные системы имхо проще моделить в мышизме. MT> Синтезируемые вещи отлично пишутся на HDL.

Сегодня есть смысл на стыке синтезируемого и несинтезируемого сложного окружения.

MT> Уже есть некоторые средства перехода от мышизма прямо к HDL MT> (Xilinx System Generator и аналогичная штука у Альтеры).

Это пока на уровне тех же фантазий. Кроме того, то, о чем ты говоришь, - это генерация синтезируемого блока, а не моделирование системы.

MT> СистемСи имхо остаётся ууузенькая ниша между мышизмом MT> и HDL.

Не такая уж и узенькая. Тестбенчи можно свободно писать на SystemC, при этом нет необходимости во всяких PLI.

MT> Причём средств перехода к HDL пока толком нет.

Как это нет??!! Уже упомянутый DC. Есть и другие - от Celoxica. Я бы попробовал, да времени нету на это.

HZ>> Синплифай, к примеру, уже кое-что начал поддерживать. MT> С какой версии ?

Начиная с версий 8.хх. Пока там оно больше на уровне синтаксиса. Но процесс пошел, подождем.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required