С учетом того, что наш ПЛИС мы запустили на частоте 10 МГц, и наши попугаи становятся равны ~0.36.
Похоже я немного не понял результаты. Здесь действительно "попугаи", которые я принял за см/мгц. Если бы процессор запустили на 100 МГц, то попугаев было бы 0.038. Значение же коремарка на мегагерц от частоты не зависит. Интересные курсы повышения квалификации :)
Теперь к насущным вопросам: кто-то в здравом уме будет запускать AMD GPU на ПЛИС?
Странный вопрос :) В Вашем случае ПЛИС вторична, а подключали Вы GPU к СнК , мощь которой (процессор с его адресным пространством, DDR память, PCI-E интерфейс) вполне соответствуют подключаемому устройству.
Меня учили (давно правда было), что инверторы в кольце ЗЯ не совсем обычные. Р-канальный транзистор, что к питанию, он сделан особенным, а именно , с бОльшим сопротивлением. Запись в ячейку всегда делается нулем. В исходном состоянии парофазная шина подзаряжена в 11. И по сути во время записи мы имеем соединение земли с питанием через: мощный N-транзистор усилителя, мелкий N-транзистор ЗУ и высокоомный Р-транзистор к питанию. Можно просчитать такую конструкцию на предмет скорости записи и считывания.
обычно используют кальку "байпас" или просто - обходной путь. Но у Вас как-то живее. Если бы кэш был ОН, а память ОНА, то фраза "она меня пробросила" была бы в точку :)
То есть в кэш инструкций попадают инструкции, работающие с памятью, а в кэш данных не попадают значения из стека, которые пачкой читаются в регистры. Возможно это стоило бы сделать фичей, если только память и дальше будет успевать отвечать за один такт.
Здесь Вы сделали изобретение до которого в свое время не могли додуматься инженеры Analog Devices в своих DSP, У них традиционно были две памяти - память программ и память данных. Но память программ делалась двухпортовой т.к. в одном такте DSP мог делать две операции с данными. Одна из таких операций могла давать конфликт с чтением команды из памяти программ. И только со временем у них появился кэш, который хранил только "конфликтные" инструкции.
Впечатляющий труд. В однотактную модель Вы смогли вместить и кэш-память. Очень интересное слово "проброс". Никогда не встречал. Насколько я понял, так Вы обозначаете ситуацию когда вместо кэша результат дает память. По сути сейчас (из той версии кода, что я смотрел) у Вас кэш и внешняя память работают параллельно за один такт. Если где-то подкачал кэш - выручает память. Поэтому никаких потерь в коремарке и не обнаружилось.
По всему видно у Вас хороший компилятор, т.к. мой даже не стал векторизовать начальный код :) Да и интринсики у меня тоже не работают :) Пришлось мне Ваш итоговый код набрать ассемблером
Вы в своем коде напрочь игнорируете скобки, там где они и не нужны особо. Это явный признак профи (старичка). Я вот себе такого не позволяю и все беру в скобки, и потом пересчитываю чтобы открывающих было ровно столько сколько закрывающих
Я пишу if(nres==0) уже лет 25 и даже не задумываюсь, что это признак новичка :) Я просто на это не обращаю внимания. Вот если бы книга Харрисов уже тогда была мне доступна, то у меня вошло бы в привычку писать if(!nres)
А я вот не понял ни вопроса Юрия , ни Вашего ответа. Вот если бы вопрос был в стиле книги Харрисов (еще раз спасибо DmitryZlobec) :"Какое несоответствие между рисунком паровозика и приложенной к нему модели ?" Такой вопрос был бы мне понятен.
Отличный результат. В части 3 я Вам написал в комментарии:
В РС пишется то, что и ранее. А вот наружу выдается pc_result и там защелкивается в буфере синхронной памяти. Так работает память. Для данных вы читаемые данные не получите в текущем такте, только в следующем. И нужен будет дополнительный порт записи в РОНы. Еще нужен будет bypass для загружаемых данных чтобы следующая команда не тормозила, если эти данные нужны ей.
И у Вас будет и синхронная стандартная память, и однотактная модель.
К моему удовольствию, Вы сделали то, о чем я Вас просил. Вам нужно только еще почитать как делать побайтовую запись в память и все будет отлично. Проблема чтения после записи Вами выдумана по незнанию как работает синхронная память. Команда записи может выполняться в том же такте , что и команды АЛУ. Результат АЛУ можно было и не передавать на следующую стадию, а писать сразу в РОН. А вот что Вы хорошо сделали, так это bypass данных команд LD.
В итоге у вас все та же однотактная модель ,но с синхронной памятью . И это уже здорово.
Кстати, именно поэтому Вы не потеряли на коремарке ничего. Ну только несколько сотен тактов на выдуманной (для данной модели !) проблеме чтения после записи.
Похоже, "попугаи" можно перевести в км/мгц . Это будет 1/3.62 = 0.27 :)
Похоже я немного не понял результаты. Здесь действительно "попугаи", которые я принял за см/мгц. Если бы процессор запустили на 100 МГц, то попугаев было бы 0.038. Значение же коремарка на мегагерц от частоты не зависит. Интересные курсы повышения квалификации :)
Я уже лет 25 не повышал квалификацию, поэтому может без умножения коремарк сейчас быстрее чем с умножением.
Я впечатлен результатами. Это лучше чем в самом свежем МК от Baikal (https://www.baikalelectronics.ru/products/baikal-u/). И при этом у Вас нет даже умножения.
Может Вы в курсе характеристик SCR9 ? Помогает ли ему в соревновании с BI-672 векторное расширение ? :)
Странный вопрос :) В Вашем случае ПЛИС вторична, а подключали Вы GPU к СнК , мощь которой (процессор с его адресным пространством, DDR память, PCI-E интерфейс) вполне соответствуют подключаемому устройству.
Скажите, на сколько процентов 2хпортовая память больше однопортовой, такого же размера , при использовании Вашего компилятора?
Меня учили (давно правда было), что инверторы в кольце ЗЯ не совсем обычные. Р-канальный транзистор, что к питанию, он сделан особенным, а именно , с бОльшим сопротивлением. Запись в ячейку всегда делается нулем. В исходном состоянии парофазная шина подзаряжена в 11. И по сути во время записи мы имеем соединение земли с питанием через: мощный N-транзистор усилителя, мелкий N-транзистор ЗУ и высокоомный Р-транзистор к питанию. Можно просчитать такую конструкцию на предмет скорости записи и считывания.
обычно используют кальку "байпас" или просто - обходной путь. Но у Вас как-то живее. Если бы кэш был ОН, а память ОНА, то фраза "она меня пробросила" была бы в точку :)
Здесь Вы сделали изобретение до которого в свое время не могли додуматься инженеры Analog Devices в своих DSP, У них традиционно были две памяти - память программ и память данных. Но память программ делалась двухпортовой т.к. в одном такте DSP мог делать две операции с данными. Одна из таких операций могла давать конфликт с чтением команды из памяти программ. И только со временем у них появился кэш, который хранил только "конфликтные" инструкции.
Впечатляющий труд. В однотактную модель Вы смогли вместить и кэш-память. Очень интересное слово "проброс". Никогда не встречал. Насколько я понял, так Вы обозначаете ситуацию когда вместо кэша результат дает память. По сути сейчас (из той версии кода, что я смотрел) у Вас кэш и внешняя память работают параллельно за один такт. Если где-то подкачал кэш - выручает память. Поэтому никаких потерь в коремарке и не обнаружилось.
По всему видно у Вас хороший компилятор, т.к. мой даже не стал векторизовать начальный код :) Да и интринсики у меня тоже не работают :) Пришлось мне Ваш итоговый код набрать ассемблером
Скалярный вариант исполнился за 19 тактов, а векторный за 26. Итого 0.73 У Вас 0.69. Практически одинаковое "ускорение" от векторизации :)
Вы в своем коде напрочь игнорируете скобки, там где они и не нужны особо. Это явный признак профи (старичка). Я вот себе такого не позволяю и все беру в скобки, и потом пересчитываю чтобы открывающих было ровно столько сколько закрывающих
Я пишу if(nres==0) уже лет 25 и даже не задумываюсь, что это признак новичка :) Я просто на это не обращаю внимания. Вот если бы книга Харрисов уже тогда была мне доступна, то у меня вошло бы в привычку писать if(!nres)
надеюсь, что это еще не завершение. У автора часто звучит "кэши", "ООО". Так что продолжение должно следовать. Не боги процессоры обжигают :)
Значит у Вас талант к процессорам ибо Вы идеально точно повторили в первой части однотактную модель, приведенную в их книге.
А я вот не понял ни вопроса Юрия , ни Вашего ответа. Вот если бы вопрос был в стиле книги Харрисов (еще раз спасибо DmitryZlobec) :"Какое несоответствие между рисунком паровозика и приложенной к нему модели ?" Такой вопрос был бы мне понятен.
Отличный результат. В части 3 я Вам написал в комментарии:
К моему удовольствию, Вы сделали то, о чем я Вас просил. Вам нужно только еще почитать как делать побайтовую запись в память и все будет отлично. Проблема чтения после записи Вами выдумана по незнанию как работает синхронная память. Команда записи может выполняться в том же такте , что и команды АЛУ. Результат АЛУ можно было и не передавать на следующую стадию, а писать сразу в РОН. А вот что Вы хорошо сделали, так это bypass данных команд LD.
В итоге у вас все та же однотактная модель ,но с синхронной памятью . И это уже здорово.
Кстати, именно поэтому Вы не потеряли на коремарке ничего. Ну только несколько сотен тактов на выдуманной (для данной модели !) проблеме чтения после записи.
Если добавить unroll-loops да inline , то даже до 3.72 добираемся :) Правда кода в 3 раза больше.
Большое спасибо.