Модификации выполняемого кода в кэше целевого процессора - ближайший ориентир проектирования.
Запись от Hrethgir размещена 15.12.2023 в 21:21
Показов 1486
Комментарии 2
|
Процессор планируется свой, на FPGA. [URL="https://habr.com/ru/articles/769972/"]В последнем, на этот момент, опыте[/URL], были применены циклы с параметром, но весь фокус не на этом, фокус в том, что по сути на итерациях внешних циклов внутренние выполняли несколько иные функции. Код пришлось растянуть, продублировав часть, для генерации последней строки. Первое что приходит в голову - не усложнять на ранних этапах, а следовать простым путём, всё тем-же через циклы, так как это должно повлиять на архитектуру, так как в естественной среде любая сложная сущность состоит из множества более простых. Следовательно добавляю [B][I]count0[/I][/B], пусть даже в синтаксисе pascal это выглядит богомерзко, но pascal уже выполняет роль псевдокода, для проекта под новый процессор, поэтому пусть выглядит так, как выглядит. И как-бы тогда можно было сократить генератор в своём процессоре: [PASCAL] count0:=1; if Not (count1 = 0) Then begin marking0://///////////////////////////////////////////////////////////////////////////////////////////добавил цикл, пусть это выглядит неприглядно, суть не в этом count1:=yRazmerY;////кроме последней строки if Not (count1 = 0) Then begin //2 marking1: p := @p1; x := xRazmerX; TracerY := y - steps1; formula1:= stepFrequent * y + znak *trunc(y / (SummSteps)); if TracerY < 0 then begin TracerX := RazmerX - formula1; if TracerX < 0 then TracerX := 0; TracerY := 0; end else TracerX := 0; BremainderstepsFrequentCicles:=remainderstepsFrequentCicles;//3 BstepsSetapInLine:=stepsSetapInLine; Balternation:=alternation; BstepsFrequentCicles:=stepsBig; BstepFrequent:=stepFrequent;///3 count2:=remainderCicles;//4 if Not (count2 = 0) Then begin marking2: count3:=BremainderstepsFrequentCicles;//5 if Not (count3 = 0) Then begin marking3: count4:=BstepsSetapInLine;//6 if Not (count4 = 0) Then begin marking4: Bstep:=BstepFrequent;//7///7 count5:=Balternation;//8 if Not (count5 = 0) Then begin marking5: count6:=BstepsFrequentCicles;//9 if Not (count6 = 0) Then begin marking6: count7:=Bstep;//10 //count7 if Not (count7 = 0) Then begin marking7: {%REGION 'Engine'} asm JMP p end; p1: StringGrid1.Cells[px^, py^] := IntToStr(pTracerX^) + ',' + IntToStr(pTracerY^) + ',' + '1'; //запись правого столбца p := @p3; goto p4; p2: y1:=y+1; //автоматическое забивание координат в местах скоса трассы p := @p3; goto p5; p3: y1:=y; p5: x1:=x-xInc; StringGrid1.Cells[px^, py^] := IntToStr(px1^) + ',' + IntToStr(py1^) + ',' + '0'; //автоматическое забивание координат трассы на прямых участках p4: x:=x+xInc; {%ENDREGION} dec(count7); if Not (count7 = 0) then goto marking7; end;///10 p := @p2; /////после выполнения строки 110 эта строка должна замениться блоком кода, что следует за этим листингом dec(count6); if Not (count6 = 0) then goto marking6; end;//11 Bstep:=stepRare;//12 BstepsFrequentCicles:=1; dec(count5); if Not (count5 = 0) then goto marking5; end;//13 BstepFrequent:=stepFrequent;//14 BstepsFrequentCicles:=stepsBig; dec(count4); if Not (count4 = 0) then goto marking4; end;//15 BremainderstepsFrequentCicles:=1;//16 BstepsSetapInLine:=1; Balternation:=1; BstepsFrequentCicles:=remainderstepsFrequent;///16 dec(count3); if Not (count3 = 0) then goto marking3; end;//17 if BremainderstepsFrequentCicles = 0 then begin BstepsSetapInLine:=1; Balternation:=1; end; BstepFrequent:=remainder;//18 BremainderstepsFrequentCicles:=1; BstepsFrequentCicles:=1; dec(count2); if Not (count2 = 0) then goto marking2; end;//19 Inc(y); dec(count1); if Not (count1 = 0) then goto marking1; end; //20 modification1://////////////////////////////////////////////////////активация модификации if Not (count0 = 0) then goto marking0; end; //21 [/PASCAL] , второй листинг с с активируемым длоком кода [PASCAL] //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца if steps = 0 then steps := SummSteps; if RazmerX > RazmerY then begin Dec(steps1); TracerX := x - ( znak*sign(trunc((1+sign(y-trunc(y/(stepsBig+1))*(stepsBig+1)-steps)/2))) + formula1)+1; if TracerX<1 then begin TracerY := y - steps1; TracerX := 0; if TracerY < 0 then TracerY := 0; end; end else begin Dec(steps1); TracerY := y - steps1; TracerX := 0; end; p := @p6; Dec(steps);//////// [/PASCAL] . И что думается на этот счёт в первую очередь, что при использовании циклов модификации в теле цикла можно использовать "разрешено" (allowed) и "запрещено" (forbidden), последнее является альтернативой [B][I]break[/I][/B], но при этом цикл не обрывается (я вообще скептически относился к этой комманде, так как к циклу с параметром она не имеет смысла применения вообще, а все остальные я постараюсь обойти, и как можно лучше это сделать в новом ЯП, если конечно эта задача будет иметь решение). Тогда в теле любого цикла можно будет создавать сколько угодно разрешённых и зарпещённых областей, разделяя их хоть вложенными циклами, хоть метками, чем угодно. Например [CODE] начало цикла 0 разрешение первое; запрет первый; вложенный цикл; разрешение второе; запрет второй; конец цикла 0; [/CODE] На самом деле это очень мощный инструмент, если процессор разрешает модификацию выполняемого кода (по сути в запрет первый можно поместить разрешение второе, а при большем наличии выполнять и более сложные модификации). Это будет требовать тщательного журналирования всех важных событий модификаций. Кэшей при этом лучше наверное вести 2 параллельно, один под итерации циклов, второй под запреты и разрешения, третий уже под переменные и обрабатываемые данные. В общем модифицирующийся в рантайме код - это мой выбор как минимум для написания всяких движков и генераторов, на целевом (пока так назову свой процессор) процессоре. Так как это попытка упрощения моделирования естественной среды, то возможно это мной применится и для различных симуляторов, и в чём угодно далее. Пусть пока остаётся много не продуманных деталей, но так или иначе их нужно обозначать как цели пока неопределённой дистанции. То-есть нужно иметь отдельный кэш модификаций, и отдельно под циклы. Пока так. Вопрос размещения циклов в области разрешения и запретов - пока под вопросом, так как выглядит сложновато для реализации (чтобы делать сущности взаимозаменяемыми - необходима новая первая , гораздо сложнее любых последующих). |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
Правильнее даже сказать теневые области кода кода и...сенсорные наверное...ближе к области, и более естественно.Запись от Hrethgir размещена 15.12.2023 в 22:41
-
Ответил.
[url]https://www.cyberforum.ru/post17154091.html[/url]Запись от Hrethgir размещена 17.12.2023 в 22:09


