Pull to refresh
27
0
Виктор @byman

Пользователь

Send message

Похоже, "попугаи" можно перевести в км/мгц . Это будет 1/3.62 = 0.27 :)

С учетом того, что наш ПЛИС мы запустили на частоте 10 МГц, и наши попугаи становятся равны ~0.36.

Похоже я немного не понял результаты. Здесь действительно "попугаи", которые я принял за см/мгц. Если бы процессор запустили на 100 МГц, то попугаев было бы 0.038. Значение же коремарка на мегагерц от частоты не зависит. Интересные курсы повышения квалификации :)

Я уже лет 25 не повышал квалификацию, поэтому может без умножения коремарк сейчас быстрее чем с умножением.

Смотрим на результат - 3.62 попугая.

Я впечатлен результатами. Это лучше чем в самом свежем МК от Baikal (https://www.baikalelectronics.ru/products/baikal-u/). И при этом у Вас нет даже умножения.

Может Вы в курсе характеристик SCR9 ? Помогает ли ему в соревновании с BI-672 векторное расширение ? :)

Теперь к насущным вопросам: кто-то в здравом уме будет запускать AMD GPU на ПЛИС? 

Странный вопрос :) В Вашем случае ПЛИС вторична, а подключали Вы GPU к СнК , мощь которой (процессор с его адресным пространством, DDR память, PCI-E интерфейс) вполне соответствуют подключаемому устройству.

Скажите, на сколько процентов 2хпортовая память больше однопортовой, такого же размера , при использовании Вашего компилятора?

Меня учили (давно правда было), что инверторы в кольце ЗЯ не совсем обычные. Р-канальный транзистор, что к питанию, он сделан особенным, а именно , с бОльшим сопротивлением. Запись в ячейку всегда делается нулем. В исходном состоянии парофазная шина подзаряжена в 11. И по сути во время записи мы имеем соединение земли с питанием через: мощный N-транзистор усилителя, мелкий N-транзистор ЗУ и высокоомный Р-транзистор к питанию. Можно просчитать такую конструкцию на предмет скорости записи и считывания.

обычно используют кальку "байпас" или просто - обходной путь. Но у Вас как-то живее. Если бы кэш был ОН, а память ОНА, то фраза "она меня пробросила" была бы в точку :)

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

Здесь Вы сделали изобретение до которого в свое время не могли додуматься инженеры Analog Devices в своих DSP, У них традиционно были две памяти - память программ и память данных. Но память программ делалась двухпортовой т.к. в одном такте DSP мог делать две операции с данными. Одна из таких операций могла давать конфликт с чтением команды из памяти программ. И только со временем у них появился кэш, который хранил только "конфликтные" инструкции.

Впечатляющий труд. В однотактную модель Вы смогли вместить и кэш-память. Очень интересное слово "проброс". Никогда не встречал. Насколько я понял, так Вы обозначаете ситуацию когда вместо кэша результат дает память. По сути сейчас (из той версии кода, что я смотрел) у Вас кэш и внешняя память работают параллельно за один такт. Если где-то подкачал кэш - выручает память. Поэтому никаких потерь в коремарке и не обнаружилось.

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

unsigned int task_1_vector_fast(unsigned int n) {
	unsigned int sum;
	n--;
	    asm volatile("vsetivli x0, 3, e32, m1");
	   	asm volatile("vmv.v.x v3,  %0 ;" ::"r"(n)); // v3=n-1
		asm volatile("vle32.v v1, (%0);" ::"r"(c)); // v1  = c
		asm volatile("vmul.vv v4,v3,v1 ;"); // v4 = klm = (n-1)*c
		asm volatile("vle32.v v2, (%0);" ::"r"(d)); // v2 = d
		asm volatile("vsrl.vi v4,v4,16;");  // klm>>=16
		asm volatile("vmv.v.i v8, 0");      // sum=0
		asm volatile("vadd.vi v5,v4,1 ;");  // v5=klm+1
		asm volatile("vmul.vv v6,v4,v5 ;"); // v6 = klm*(klm+1)
		asm volatile("vmul.vv v6,v6,v2 ;"); // v6 = d * klm*(klm+1)
		asm volatile("vsra.vi v6,v6,1;");   // v6 = d * klm*(klm+1)/2
		asm volatile("vredsum.vs  v8, v6, v8");
		asm volatile("vmv.x.s %0, v8" : "=r"(sum) :);  // return = sum

	return sum;
}

Скалярный вариант исполнился за 19 тактов, а векторный за 26. Итого 0.73 У Вас 0.69. Практически одинаковое "ускорение" от векторизации :)

Вы в своем коде напрочь игнорируете скобки, там где они и не нужны особо. Это явный признак профи (старичка). Я вот себе такого не позволяю и все беру в скобки, и потом пересчитываю чтобы открывающих было ровно столько сколько закрывающих

Я пишу if(nres==0) уже лет 25 и даже не задумываюсь, что это признак новичка :) Я просто на это не обращаю внимания. Вот если бы книга Харрисов уже тогда была мне доступна, то у меня вошло бы в привычку писать if(!nres)

надеюсь, что это еще не завершение. У автора часто звучит "кэши", "ООО". Так что продолжение должно следовать. Не боги процессоры обжигают :)

Я Харрисов не читал.

Значит у Вас талант к процессорам ибо Вы идеально точно повторили в первой части однотактную модель, приведенную в их книге.

А я вот не понял ни вопроса Юрия , ни Вашего ответа. Вот если бы вопрос был в стиле книги Харрисов (еще раз спасибо DmitryZlobec) :"Какое несоответствие между рисунком паровозика и приложенной к нему модели ?" Такой вопрос был бы мне понятен.

Отличный результат. В части 3 я Вам написал в комментарии:

В РС пишется то, что и ранее. А вот наружу выдается  pc_result и там защелкивается в буфере синхронной памяти. Так работает память. Для данных вы читаемые данные не получите в текущем такте, только в следующем. И нужен будет дополнительный порт записи в РОНы. Еще нужен будет bypass для загружаемых данных чтобы следующая команда не тормозила, если эти данные нужны ей.

И у Вас будет и синхронная стандартная память, и однотактная модель.

К моему удовольствию, Вы сделали то, о чем я Вас просил. Вам нужно только еще почитать как делать побайтовую запись в память и все будет отлично. Проблема чтения после записи Вами выдумана по незнанию как работает синхронная память. Команда записи может выполняться в том же такте , что и команды АЛУ. Результат АЛУ можно было и не передавать на следующую стадию, а писать сразу в РОН. А вот что Вы хорошо сделали, так это bypass данных команд LD.

В итоге у вас все та же однотактная модель ,но с синхронной памятью . И это уже здорово.

Кстати, именно поэтому Вы не потеряли на коремарке ничего. Ну только несколько сотен тактов на выдуманной (для данной модели !) проблеме чтения после записи.

Если добавить unroll-loops да inline , то даже до 3.72 добираемся :) Правда кода в 3 раза больше.

1
23 ...

Information

Rating
5,470-th
Location
Беларусь
Registered
Activity