vezba12 sppurv

6
Припрема за лабораторијске вежбе из предмета Системска програмска подршка у реалном времену I - 2015/Вежба 12 Додела ресурса 1 Граф сметњи Проблем који онемогућава да се исти регистар додели двема привременим променљивама назива се сметња. Најчешћи узрок сметње је преклапање опсега животног века променљивих (али постоје и други разлози: на пример, ако променљива A треба да буде генерисана инструкцијом која не може да адресира регистар R тада постоји сметња између променљиве А и регистра R). Граф сметњи се често у рачунару представља матрицом сметњи. Колоне и редови матрице су исти и представљају све променљиве у програму. На пресеку одговарајуће колоне и реда биће уписан индикатор да ли постоји сметња између променљиве у колони и променљиве у реду. На слици 1 дат је граф тока управљања једног једноставног програма. Анализом животног века променљивих добијамо резултате који су приказани у табели 1. На основу резултата добијених из анализе животног века променљивих правимо граф сметњи, табела 2. A := 0 B := A + 1 C := C + B A := B * 2 A < N B := A Слика 1 Граф тока управљања USE DEF I II III OUT IN OUT IN OUT IN 6 a b a a a 5 a c ac ac ac ac ac 4 b a ac bc ac bc ac bc 3 bc c bc bc bc bc bc bc 2 a b bc ac bc ac bc ac 1 a ac c ac c ac c Табела 1 Излази из анализе животног века променљивих A B C A X B X C X X Табела 2 Матрица сметњи Да би се из резултата анализе животног века променљивих направио граф сметњи, користе се два правила: 1. За сваку дефиницију променљиве А, у чвору који није MOVE, додај у графу сметњи нову сметњу између променљиве А и сваке променљиве B i која живи на излазу чвора: (A, B 1 )(A,B n ) 2. За MOVE инструкцију А=C, додај графу сметњи нову сметње између променљиве А и сваке променљиве B i живе на излазу чвора, која није једнака C:(A, B 1 )(A,B n ); где је B i различито од C Додела ресурса Фазе у компајлеру које претходе фази доделе ресурса подразумевају да на циљаној платформи постоји неограничен број регистара (и ресурса уопште) у које се смештају променљиве. Фаза доделе ресурса има задатак да тај неограничени број регистара сведе на тачно онај број регистара колико има на циљаној платформи: нпр. Mips - 32 регистра. Још један задатак фазе доделе ресурса може бити да након доделе регистара открије MOVE инструкције које пребацују садржај између истих регистара и обрише такве инструкције. Узмимо, на пример, да је пре почетка фазе доделе ресурса у програму постојала инструкција A := B. После фазе доделе ресурса утврђено је да ове променљиве немају никаквих сметњи и променљивој А је

description

vezba12 sppurv

Transcript of vezba12 sppurv

  • I - 2015/ 12

    1

    . (

    : , A

    R R).

    .

    .

    . 1

    .

    1.

    , 2.

    A := 0

    B := A + 1

    C := C + B

    A := B * 2

    A < N

    B := A

    1

    USE DEF

    I II III

    OUT IN OUT IN OUT IN

    6 a b a a a

    5 a c ac ac ac ac ac

    4 b a ac bc ac bc ac bc

    3 bc c bc bc bc bc bc bc

    2 a b bc ac bc ac bc ac

    1 a ac c ac c ac c

    1

    A B C

    A X

    B X

    C X X

    2

    ,

    :

    1. , MOVE,

    Bi : (A,

    B1)(A,Bn)

    2. MOVE =C,

    Bi , C:(A, B1)(A,Bn); Bi

    C

    ( ) .

    : . Mips - 32 .

    MOVE

    . , , A

    := B.

  • I - 2015/ 12

    2

    R0, B R0. A := B

    R0 := R0 .

    .

    , (

    ) . ,

    . ,

    , . ,

    (),

    ( 32).

    ,

    ( ).

    :

    , ,

    .

    :

    1. (build):

    .

    2. (simplify): :

    G . G`

    , G` = G {M}. G` G,

    G`,

    -1 , .

    ,

    .

    , . :

    ? ?

    4

    , 4 (). .

    . , F

    4 (3), .

    ().

    E 3, 4,

    (). .

    .

  • I - 2015/ 12

    3

    F

    E

    B MKJ

    D

    C

    GH

    )

    FE

    B MKJ

    D

    C

    GH

    )

    FB MKJ

    D

    C

    GH

    E

    )

    FMKJ

    D

    C

    GH

    E

    B

    )

    FMJ

    D

    C

    GH

    E

    B

    K

    )

    FM

    D

    C

    GH

    E

    B

    K

    J

    )

    2

    3. (spill):

    , .

    .

    , , ,

    . ,

    .

    ,

    , .

    , .

    4. (select): .

    . ,

    .

    .

    .

    Types.h. Instruction.

    : (type), , (dst, src1,

    src2). Instructions.

    typedef struct InstructionStruct

    {

    InstructionType type;

    Variable* dst;

    Variable* src1;

    Variable* src2;

    } Instruction;

    typedef list Instructions;

  • I - 2015/ 12

    4

    Variable : (name),

    (pos), (assigment).

    Variables.

    struct Variable

    {

    char name;

    int pos;

    Regs assigment;

    };

    typedef list Variables;

    InstructionType,

    : _MOVE, T_EQU, T_SUB, T_ADD, T_MUL, T_COND, T_RE T_OTHER.

    Regs reg0, reg1, reg2 reg3.

    InterferenceGraph.

    (variables), (values)

    (size). __INTERFERENCE__

    __EMPTY__ .

    typedef struct

    {

    Variables* variables;

    char** values;

    int size;

    } InterferenceGraph;

    2. 3 , B C.

    0, B 1 C 2. (pos Variable)

    . variables,

    InterferenceGraph, . .

    C, A B, (values) , B C.

    : Lib.lib

    LivnessAnalisysLib.lib.

    Instructions.h.

    .

    , .

    void printInstruction(Instruction* instr);

    void printInstructions(Instructions* instrs);

    Variable.h.

    .

    , .

    void printVariables(Variables* variables);

    void printVariable(Variable* variable);

  • I - 2015/ 12

    5

    LivnessAnalissysLib

    LivnessAnalissysLib.h. doLivenessAnalysis

    . debug __DEBUG__

    .

    Instructions* doLivenessAnalysis(int debug);

    InterferenceGraph.h.

    doInterferenceGraph , .

    InterferenceGraph ( ).

    ( )

    freeInterferenceGraph.

    printInterferenceGraph.

    InterferenceGraph* doInterferenceGraph(Instructions* instructions);

    void freeInterferenceGraph(InterferenceGraph* ig);

    void printInterferenceGraph(InterferenceGraph* ig);

    ( ) Lib.lib,

    Simplification.h, doSimplification.

    . ( 2).

    , .

    ( ).

    stack* doSimplification(InterferenceGraph* ig, int degree);

  • I - 2015/ 12

    6

    1. . doResourceAllocation

    ResourceAllocation.h

    .

    .

    bool doResourceAllocation(stack* simplificationStack,

    InterferenceGraph* ig);