- •Отчет по лабораторной работе № 1
- •2. Общие сведения
- •3. Статический конвеер
- •3.1. Вектор столкновений
- •3.2. Диаграмма состояний
- •3.3. Модифицированная диаграмма состояний
- •4. Динамический конвеер
- •4.1. Матрица столкновений
- •4.2. Модифицированная диаграмма состояний
- •5. Оптимизация конструкций конвейера. Внедрение задержек, повышающих производительность
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,10];
время вычисления (представляется столбцами): [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