Скачиваний:
34
Добавлен:
01.05.2014
Размер:
654.85 Кб
Скачать

4.2. Модифицированная диаграмма состояний

Процедура генерирования модифицированной диаграммы состояний состоит из следующих этапов.

1. Включить в качестве состояний каждое состояние, соответствующее начальным матрицам столкновений.

2. Для любого еще не обработанного состояния и для k-го столбца матрицы столкновений этого состояния, в котором имеется хотя бы один 0, построить все совместимые наборы инициации.

З. Для каждого набора инициации выполнить операцию логического ИЛИ над совокупностью соответствующих ему матриц.

4. Удалить первые k столбцов из матрицы столкновений текущего состояния добавить к ней нули справа и выполнить операцию логического ИЛИ с результатом, полученным на шаге 3. Назвать это новым состоянием и соединить с текущим состоянием дугой, имеющей метку в виде k и набора инициации.

5. Построить все наборы инициации, считая, что столбец состоит из одних нулей Затем для каждого состояния диаграммы и каждого набора инициации построить соответствующее состояние - адресат и дугу, указав значение >= d (d - время вычисления) и перечень элементов набора.

А

Рис. 5. Модифицированная диаграмма состояний для динамического конвейера

5. Оптимизация конструкций конвейера. Внедрение задержек, повышающих производительность

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

Поэтому непосредственная реализация оставляет аппаратные средства недоиспользованными. Было бы, очевидно, полезным, если бы удалось модифицировать таблицу занятости так, чтобы общая структура не изменилась, а общая производительность возросла.

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

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

Жадная последовательность инициаций для таблицы занятости А:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

А1

А2

А3

А4

А1

А2

А1

А2

А3

А4

А3

А4

А1

А2

А1

А2

А1

А2

А3

А4

А3

А4

А3

А4

А1

А2

А3

А4



Цикл повторяется

Последовательность латентностей = 1,7,1,7, . . .

Средняя латентность = 4

Оптимальная последовательность инициаций для таблицы занятости А:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

А1

А2

А3

А4

А5

А1

А2

А1

А3

А2

А4

А3

А5

А4

А1

А1

А2

А1

А2

А3

А2

А3

А4

А3

А4

А5

А4

А1

А2

А3

А4

А5



Цикл повторяется

Последовательность латентностей = 3,3,3,3, . . .

Средняя латентность = 3

Жадная последовательность инициаций для таблицы занятости В:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

В1

В1

В2

В2

В3

В3

В1

В1

В2

В1

В2

В2

В3

В3

В4

В3

В4

В1

В1

В2

В2

В3

В3

В4

В4

Цикл повторяется

Последовательность латентностей = 3,8,3,8, . . .

Средняя латентность = 5,5

Оптимальная последовательность инициаций для таблицы занятости В:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

В1

В1

В2

В2

В3

В3

В4

В4

В1

В1

В2

В1

В2

В3

В2

В3

В4

В3

В4

В5

В4

В5

В5

В1

В1

В2

В2

В3

В3

В4

В4

В5

В5

Цикл повторяется

Последовательность латентностей = 3,3,3,3, . . .

Средняя латентность = 3

Жадная последовательность инициаций для последовательности процессов А1А2В1В2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

А1

А2

В1

В1

В2

В2

А1

А2

А1

А2

А1

А2

А1

А2

А1

А2

В1

В1

В2

В1

В2

В2

А1

А2

В1

В1

В2

В2

Цикл повторяется

Последовательность латентностей = 1,7,3,7,1,7,3,7 . . .

Средняя латентность = 4,5

Оптимальная последовательность инициаций для последовательности процессов А1А2В1В2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

А1

А2

А3

В1

В1

А4

В2

В2

А1

А2

А1

А2

А3

А4

А3

А1

А1

А2

А1

А2

В1

А2

В1

В2

В1

В2

А3

В2

А3

А4

А1

А2

В1

В1

В2

В2

А3

Цикл повторяется

Последовательность латентностей = 3,5,3,1,3,5,3,1 . . .

Средняя латентность = 3

Жадная последовательность инициаций для последовательности процессов В1В2А1А2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

В1

В1

В2

В2

А1

А2

А1

А2

А1

А2

В1

В1

В2

В1

В2

В2

А1

А2

А1

А2

А1

А2

В1

В1

В2

В2

А1

А2

Цикл повторяется

Последовательность латентностей = 3,7,1,7,3,7,1,7 . . .

Средняя латентность = 4,5

Оптимальная последовательность инициаций для последовательности процессов В1В2А1А2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

А1

В1

В1

А2

В2

В2

А3

В3

А1

А2

А1

А2

А3

В1

В1

В2

В1

В2

А1

В2

А1

А2

А1

А2

В3

А2

В3

В4

В3

В4

В1

В1

В2

В2

А1

А2

В3

В3

В4

Цикл повторяется

Последовательность латентностей = 3,1,3,5,3,1,3,5 . . .

Средняя латентность = 3

6. Моделирующая программа

6.1. Текст моделирующей программы

program lab1;

uses

Forms,

ufrmMain in 'ufrmMain.pas' {frmMain},

uTables in 'uTables.pas',

ufrmStatic in 'ufrmStatic.pas' {frmStatic},

ufrmLangWin in 'ufrmLangWin.pas' {frmLangWin},

ufrmScheme in 'ufrmScheme.pas' {frmScheme},

uLang in 'uLang.pas',

uMisc in 'uMisc.pas',

ufrmInpCycl in 'ufrmInpCycl.pas' {frmInpCycl},

ufrmBuildMain in 'ufrmBuildMain.pas' {frmBuildMain},

uSet in 'uSet.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TfrmMain, frmMain);

Application.CreateForm(TfrmInpCycl, frmInpCycl);

Application.Run;

end.

unit ufrmMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Tabs, ExtCtrls, Grids, StdCtrls, Spin, ActnList;

type

TfrmMain = class(TForm)

CPanel: TPanel;

WPanel: TPanel;

TabSet: TTabSet;

Label1: TLabel;

seStupCount: TSpinEdit;

Label2: TLabel;

seCurOpLen: TSpinEdit;

Label3: TLabel;

DiagramGrid: TDrawGrid;

Button1: TButton;

ActionList1: TActionList;

actAddOP: TAction;

actDelOp: TAction;

Button2: TButton;

Button3: TButton;

actCalcStaic: TAction;

Button4: TButton;

actClearTable: TAction;

actScheme: TAction;

Bevel1: TBevel;

Bevel2: TBevel;

Button5: TButton;

Button6: TButton;

actBuildByCycl: TAction;

Button7: TButton;

Bevel3: TBevel;

procedure FormCreate(Sender: TObject);

procedure DiagramGridDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure FormShow(Sender: TObject);

procedure actAddOPExecute(Sender: TObject);

procedure actAddOPUpdate(Sender: TObject);

procedure actDelOpExecute(Sender: TObject);

procedure actDelOpUpdate(Sender: TObject);

procedure TabSetChange(Sender: TObject; NewTab: Integer;

var AllowChange: Boolean);

procedure DiagramGridMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure seCurOpLenChange(Sender: TObject);

procedure seStupCountChange(Sender: TObject);

procedure actCalcStaicExecute(Sender: TObject);

procedure actClearTableExecute(Sender: TObject);

procedure DiagramGridKeyPress(Sender: TObject; var Key: Char);

procedure actSchemeExecute(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure actBuildByCyclExecute(Sender: TObject);

private

public

CurTable:Integer;

procedure UpdateTabSet;

procedure UpdateTable;

procedure Select(idx:INteger);

end;

var

frmMain: TfrmMain;

implementation

uses uTables, ufrmStatic, ufrmLangWin, ufrmScheme, uLang, ufrmInpCycl,

ufrmBuildMain;

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);

begin

with DiagramGrid do begin

DefaultRowHeight:=20;

DefaultColWidth:=ClientWidth div 16;

ColCount:=16;

RowCount:=11;

seStupCount.Value := StupCount;

end;

end;

procedure TfrmMain.DiagramGridDrawCell(Sender: TObject; ACol,

ARow: Integer; Rect: TRect; State: TGridDrawState);

var grid:TDrawGrid;

begin

grid:=TDrawGrid(Sender);

with Grid, Grid.Canvas do begin

if (ACol = 0) or (ARow = 0) then begin

if (ARow<=StupCount) and (ACol<=Tables[CurTable].Len) then

Brush.Color:=RGB(200,220,240)

else

Brush.Color:=RGB(150,170,190);

FillRect(Rect);

Font.Style := [];

Font.Color:=clBlack;

if ARow>0 then textout(Rect.Left+2,Rect.Top+2,IntToStr(ARow));

if ACol>0 then textout(Rect.Left+2,Rect.Top+2,IntToStr(ACol))

end else begin

if (ARow<=StupCount) and (ACol<=Tables[CurTable].Len) then begin

Brush.Color:=RGB(250,250,250);

Font.Color:=clBlack;

end else begin

Brush.Color:=RGB(220,220,220);

Font.Color:=RGB(150,150,150);

end;

FillRect(Rect);

Font.Style := [fsBold];

if Tables[CurTable][ACol,ARow] then

textout(Rect.Left+8,Rect.Top+2,Chr(CurTable+Ord('A')-1));

end;

with Pen do begin

Color:=clBlack;

Style:=psSolid;

Width:=1;

end;

if (ARow=StupCount) and (ACol<=Tables[CurTable].Len)

then with Rect do begin

MoveTo(Left, Bottom);

LineTo(Right, Bottom);

end;

if (ACol=Tables[CurTable].Len) and (ARow<=StupCount)

then with Rect do begin

MoveTo(Right, Top);

LineTo(Right, Bottom);

end;

end;

end;

procedure tfrmMain.UpdateTabSet;

var i:Integer;

begin

with TabSet do begin

Tabs.Clear;

For i:=0 to Tables.Count-1 do Tabs.Add(' '+Chr(i+ord('A'))+' ');

end;

end;

procedure tfrmMain.UpdateTable;

begin

seCurOpLen.Value := Tables[CurTable].len;

DiagramGrid.Repaint;

end;

procedure tfrmMain.Select(idx:INteger);

begin

CurTable:=idx;

if CurTable<1 then CurTable := 1;

if CurTable>Tables.Count then CurTable := Tables.Count;

UpdateTable;

end;

procedure TfrmMain.FormShow(Sender: TObject);

begin

UpdateTabSet;

Select(1);

TabSet.TabIndex:=0;

end;

procedure TfrmMain.actAddOPExecute(Sender: TObject);

begin

if Tables.Add then begin

UpdateTabSet;

Select(Tables.Count);

TabSet.TabIndex := CurTable-1;

end else

ShowMessage('ОШИБКА: Не удаётся выполнить операцию добаления таблицы!');

end;

procedure TfrmMain.actAddOPUpdate(Sender: TObject);

begin

actAddOp.Enabled := Tables.Count<MaxTablesNum;

end;

procedure TfrmMain.actDelOpExecute(Sender: TObject);

begin

if Tables.Del(TabSet.TabIndex+1) then begin

UpdateTabSet;

Select(CurTable);

TabSet.TabIndex := CurTable-1;

end else

ShowMessage('ОШИБКА: Не удаётся выполнить операцию удаления таблицы!');

end;

procedure TfrmMain.actDelOpUpdate(Sender: TObject);

begin

actDelOp.Enabled := (TabSet.TabIndex>=0) and (Tables.Count>1);

end;

procedure TfrmMain.TabSetChange(Sender: TObject; NewTab: Integer;

var AllowChange: Boolean);

begin

AllowChange:=True;

Select(NewTab+1);

end;

procedure TfrmMain.DiagramGridMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Var i,j:INteger;

begin

TDrawGrid(Sender).MouseToCell(x,y, i, j);

if (i>=1) and (i<=Tables[CurTable].len) and

(j>=1) and (j<=StupCount) then

begin

if ssLeft in Shift then Tables[CurTable][i,j]:=not Tables[CurTable][i,j];

{ if ssRight in Shift then begin

Tables[CurTable][i,j]:=False;

with TDrawGrid(Sender) do begin

Col := i; Row := j;

Update;

end;

end; }

end;

end;

procedure TfrmMain.seCurOpLenChange(Sender: TObject);

begin

Tables[CurTable].len := TSpinEdit(Sender).Value;

UpdateTable;

end;

procedure TfrmMain.seStupCountChange(Sender: TObject);

begin

StupCount := TSpinEdit(Sender).Value;

UpdateTable;

end;

procedure TfrmMain.actCalcStaicExecute(Sender: TObject);

begin

ShowStaticFor(CurTable);

end;

procedure TfrmMain.actClearTableExecute(Sender: TObject);

begin

Tables[CurTable].Clear;

UpdateTable;

end;

procedure TfrmMain.DiagramGridKeyPress(Sender: TObject; var Key: Char);

begin

if key = #13 then with TDrawGrid(Sender) do begin

if (Col>=1) and (Col<=Tables[CurTable].len) and

(Row>=1) and (Row<=StupCount) then begin

Tables[CurTable][Col, Row] := not Tables[CurTable][Col, Row];

UpdateTable;

end;

end;

end;

procedure TfrmMain.actSchemeExecute(Sender: TObject);

var prog:TProg;

begin

prog := GetProgFromUser;

if prog<>nil then begin

ShowScheme(prog);

prog.Free;

end;

end;

procedure TfrmMain.Button6Click(Sender: TObject);

begin

Close;

end;

procedure TfrmMain.actBuildByCyclExecute(Sender: TObject);

var lseq:TLatenceSeq;

begin

lseq := GetCyclFromUser;

if lseq<>nil then begin

BuildByCycl(lseq);

lseq.Free;

end;

end;

end.

unit ufrmBuildMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, uTables, uSet;

type

TfrmBuildMain = class(TForm)

GroupBox1: TGroupBox;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

edtC: TEdit;

edtP: TEdit;

edtL: TEdit;

edtT: TEdit;

edtGc: TEdit;

edtGcp: TEdit;

edtHcp: TEdit;

Button1: TButton;

Button2: TButton;

private

public

cycl:TLatenceSeq;

hcp:TSet;

p:INteger;

end;

procedure BuildByCycl(seq:TLatenceSeq);

implementation

{$R *.dfm}

procedure BuildByCycl(seq:TLatenceSeq);

var

frmBuildMain: TfrmBuildMain;

begin

frmBuildMain := TfrmBuildMain.Create(Application);

with frmBuildMain do begin

Cycl:=seq;

edtC.text:=Cycl.GetAsString;

p := Cycl.CalcPeriod;

edtP.text:=IntTostr(p);

edtL.text:=Cycl.GetAsStringSchem(3);

edtT.Text:=Cycl.GetAsStringTSchem(3);

hcp := Cycl.CalcGC(2);

edtGc.Text:= SetToStr(hcp, true, 4*Cycl.Len);

ModP(hcp,p);

edtGcp.Text:= SetToStr(hcp, false);

Notp(hcp,p);

edtHcp.Text:= SetToStr(hcp, false);

ShowModal;

Free;

end;

end;

end.

unit ufrmInpCycl;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, uTables;

type

TfrmInpCycl = class(TForm)

Edit1: TEdit;

Label1: TLabel;

btnOk: TButton;

Button2: TButton;

private

{ Private declarations }

public

{ Public declarations }

end;

function GetCyclFromUser:TLatenceSeq;

var

frmInpCycl: TfrmInpCycl;

implementation

uses uMisc;

{$R *.dfm}

function TransCycl(str:String):TLatenceSeq;

var lseq:TLatenceSeq;

err,t:Integer;

s,w:String;

begin

err:=0; lseq:=nil;

if (str[1]<>'(') or (str[length(str)]<>')') then err:=1;

if err=0 then begin

s:=copy(str,2,length(str)-2);

lseq:=TLatenceSeq.Create;

while (s<>'') and (err=0) do begin

t:=pos(',',s);

if t=0 then begin

w:=s; s:='';

end else begin

w:=copy(s,1,t-1);

delete(s,1,t);

end;

val(w,t,err);

if err<>0 then err:=1 else begin

if (t<1) or (t>16) then err:=2 else lseq.Add(t);

end;

end;

if lseq.Len<1 then err:=3;

if lseq.Len>10 then err:=4;

end;

if err<>0 then begin

case err of

1:ShowErrMsg('Синтаксическая ошибка при задании цикла "'+str+'"!');

2:ShowErrMsg('Не допустимая латентность '+IntTostr(t)+'!');

3:ShowErrMsg('Число цикла должен содержать хотябы одну латентность!');

4:ShowErrMsg('Число латентностей в цикле не должно превышать 10!');

end;

if lseq<>nil then lseq.Free;

lseq:=nil;

end;

Result := lseq;

end;

function GetCyclFromUser:TLatenceSeq;

var all_good:Boolean;

lseq:TLatenceSeq;

begin

lseq := nil;

Repeat

all_good:=true;

if frmInpCycl.ShowModal = mrOk then begin

lseq := TransCycl(frmInpCycl.Edit1.Text);

all_good := lseq <> nil;

end;

Until all_good;

if lseq<>nil then lseq.Cycl := 1;

Result := lseq;

end;

end.

unit ufrmLangWin;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, uLang;

type

TfrmLangWin = class(TForm)

Memo: TMemo;

btnRun: TButton;

btnCancel: TButton;

procedure btnCancelClick(Sender: TObject);

procedure btnRunClick(Sender: TObject);

private

prog:TProg;

public

end;

function GetProgFromUser:TProg;

implementation

uses uMisc;

{$R *.dfm}

function GetProgFromUser:TProg;

begin

with TfrmLangWin.Create(Application) do begin

ShowModal;

Result := Prog;

Free;

end;

end;

procedure TfrmLangWin.btnCancelClick(Sender: TObject);

begin

prog := nil;

end;

procedure TfrmLangWin.btnRunClick(Sender: TObject);

begin

prog := Translate(Memo.Lines);

if prog = nil then Modalresult := mrNone else

if prog.Length=0 then begin

ShowErrMsg('Задайте не пустую программу работы конвейра!');

Modalresult := mrNone;

end;

end;

end.

6.2. Инструкция пользователя

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

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

Диспетчеризация предполагает, что точная схема использования ступеней известна для каждой входной величины до ее запуска в конвейер. Схемы представлены в виде таблиц занятости.

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

При запуске модуля Исследование конвейера.exeпоявляется следующее диалоговое окно:

Вы можете ввести:

  1. последовательное число ступеней (строки) конвейера:[1,10];

  1. время вычисления (представляется столбцами): [1,16].

Кнопка «Добавить операцию» предполагает добавление очередной таблицы занятости. Соответственно ее можно и удалить «Удалить операцию».

Заполнение таблицы - ввод инициаций

Таблица занятости заполняется посредством установки курсора на ячейке таблицы и единичного нажатия клавиши мыши.

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

Таблица занятости построена:

Теперь можно посмотреть работу статического конвейера:

Вектор столкновений показывает допустимые латентности между двумя инициациями одной и той же таблицы занятости.

Если где-либо в графе ”время-ступень” оказываются две метки, то очередной разряд вектора столкновений полагается равным 1, в противном случае - 0.

Осуществляется построения множества допустимых последовательных латентностей с простыми циклами. В данном случае простой цикл - <(1,5)>.

Avg- средняя латентность (среднее время между инициациями). Множество строится с возрастанием средней латентности, т.е. оптимальная - первая.

Для первой последовательности - схема работы:

Разными цветами обозначается начало следующего периода.

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

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

При выборе кнопки -Схема работы возможна замена программы в допустимом формате.

Например,(0,A)^(2,A). Нажав на запуск, получаем:

В данном случае оптимальной стратегии не получилось, так как имеются столкновения.

Возможно построение конвейера по циклу. Допустим, этот цикл: (1,5,7)

Программа строит максимально совместимые множества.

Максимально совместимое множество A по отношению к Hc, это такое множество целых положительных чисел для которого:

1. для любых i, j из A : |i-j| принадлежит Hc

2. не существует множеств удовл. 1, содержащих данное

Множество инициаций

Gc = {T[i]-T[j] : i>j>=0 }Gc mod p = { i mod p : i in Gc }

Множество

Hc = N \ Gc

Hc mod p = (N mod p) \ Gc

27