Advertisement
Guest User

Untitled

a guest
Mar 5th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 6.34 KB | None | 0 0
  1. with Ada.Text_IO; use Ada.Text_IO;
  2. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
  3. with Ada.Synchronous_Task_Control; use Ada.Synchronous_Task_Control;
  4.  
  5. procedure Lab1 is
  6.   N: integer := 4;
  7.  
  8.   P: integer := 2;
  9.   H: integer := N/P;
  10.  
  11.   a: integer; -- 2 stream
  12.   e: integer; -- 1 stream
  13.  
  14.   type Int_Vector is array (1..N) of Integer;
  15.   type Int_Matrix is array (1..N) of Int_Vector;
  16.  
  17.   MatrixA: Int_Matrix; -- 1 stream
  18.   MatrixK: Int_Matrix; -- 2 stream
  19.   MatrixR: Int_Matrix; -- 2 stream
  20.   MatrixO: Int_Matrix; -- 1 stream
  21.  
  22.   Left: Int_Matrix;
  23.   Matrix: Int_Matrix;
  24.   Right: Int_Matrix;
  25.  
  26.   Sem1, Sem2, Sem3, Skd: Suspension_Object;
  27.  
  28.   --filling matrix
  29.   function fill_matrix(number: integer) return Int_Matrix is
  30.   matr: Int_Matrix;
  31.   begin
  32.     for i in 1..N loop
  33.       for j in 1..N loop
  34.         matr(i)(j) := number;
  35.       end loop;
  36.     end loop;
  37.     return matr;
  38.   end fill_matrix;
  39.  
  40.   --printing matrix
  41.   procedure print_matrix(matr: Int_Matrix) is
  42.   begin
  43.     for i in 1..N loop
  44.       for j in 1..N loop
  45.         put(matr(i)(j));
  46.       end loop;
  47.       new_line(1);
  48.     end loop;
  49.   end print_matrix;
  50.  
  51.   --multilpy matrix by number
  52. procedure multiply_half_matrix_by_number(matr: Int_Matrix; number: integer;half: integer;res: out Int_Matrix) is
  53.     i: integer := 0;
  54.     j: integer := 0;
  55.   begin
  56.     if half = 0 then
  57.       --if even
  58.       if N mod 2 = 0 then
  59.         for i in 1..N/2 loop
  60.           for j in 1..N loop
  61.             res(i)(j) := number * matr(i)(j);
  62.           end loop;
  63.         end loop;
  64.         --if odd
  65.       else
  66.         for i in 1..N/2+1 loop
  67.           for j in 1..N loop
  68.             res(i)(j) := number * matr(i)(j);
  69.           end loop;
  70.         end loop;
  71.       end if;
  72.     else
  73.       --if even
  74.       if N mod 2 = 0 then
  75.         for i in N/2+1..N loop
  76.           for j in 1..N loop
  77.             res(i)(j) := number * matr(i)(j);
  78.           end loop;
  79.         end loop;
  80.         --if odd
  81.       else
  82.         for i in N/2+2..N loop
  83.           for j in 1..N loop
  84.             res(i)(j) := number * matr(i)(j);
  85.           end loop;
  86.         end loop;
  87.       end if;
  88.     end if;
  89.   end multiply_half_matrix_by_number;
  90.  
  91.   procedure add_half_matrix_to_matrix(matr1: Int_Matrix; matr2: Int_Matrix;half: integer;res: out Int_Matrix) is
  92.       i: integer := 0;
  93.       j: integer := 0;
  94.     begin
  95.       if half = 0 then
  96.         --if even
  97.         if N mod 2 = 0 then
  98.           for i in 1..N/2 loop
  99.             for j in 1..N loop
  100.               res(i)(j) := matr1(i)(j) + matr2(i)(j);
  101.             end loop;
  102.           end loop;
  103.           --if odd
  104.         else
  105.           for i in 1..N/2+1 loop
  106.             for j in 1..N loop
  107.               res(i)(j) := matr1(i)(j) + matr2(i)(j);
  108.             end loop;
  109.           end loop;
  110.         end if;
  111.       else
  112.         --if even
  113.         if N mod 2 = 0 then
  114.           for i in N/2+1..N loop
  115.             for j in 1..N loop
  116.               res(i)(j) := matr1(i)(j) + matr2(i)(j);
  117.             end loop;
  118.           end loop;
  119.           --if odd
  120.         else
  121.           for i in N/2+2..N loop
  122.             for j in 1..N loop
  123.               res(i)(j) := matr1(i)(j) + matr2(i)(j);
  124.             end loop;
  125.           end loop;
  126.         end if;
  127.       end if;
  128.     end add_half_matrix_to_matrix;
  129.  
  130.   procedure multiply_half_matrix_by_matrix(matr1: Int_Matrix; matr2: Int_Matrix; half: integer;res: out Int_Matrix) is
  131.       i: integer := 0;
  132.       j: integer := 0;
  133.     begin
  134.       if half = 0 then
  135.         --if even
  136.         if N mod 2 = 0 then
  137.  
  138.           for  i in 1..N/2  loop
  139.                         for j in 1..N loop
  140.                             res(i)(j) := 0;
  141.                             for k in 1..N loop
  142.                                 res(i)(j) := res(i)(j) + (matr1(i)(k) * matr2(k)(j));
  143.                             end loop;
  144.                         end loop;
  145.                     end loop;
  146.  
  147.           --if odd
  148.         else
  149.  
  150.           for i in 1..N/2+1 loop
  151.                         for j in 1..N loop
  152.                             res(i)(j) := 0;
  153.                             for k in 1..N loop
  154.                                 res(i)(j) := res(i)(j) + (matr1(i)(k) * matr2(k)(j));
  155.                             end loop;
  156.                         end loop;
  157.                     end loop;
  158. end if;
  159.       else
  160.         --if even
  161.         if N mod 2 = 0 then
  162.  
  163.           for i in N/2+1..N loop
  164.                         for j in 1..N loop
  165.                             res(i)(j) := 0;
  166.                             for k in 1..N loop
  167.                                 res(i)(j) := res(i)(j) + (matr1(i)(k) * matr2(k)(j));
  168.                             end loop;
  169.                         end loop;
  170.                     end loop;
  171.  
  172.           --if odd
  173.         else
  174.  
  175.           for i in N/2+2..N loop
  176.                         for j in 1..N loop
  177.                             res(i)(j) := 0;
  178.                             for k in 1..N loop
  179.                                 res(i)(j) := res(i)(j) + (matr1(i)(k) * matr2(k)(j));
  180.                             end loop;
  181.                         end loop;
  182.                     end loop;
  183.  
  184.         end if;
  185.       end if;
  186.     end multiply_half_matrix_by_matrix;
  187.  
  188.   procedure Task_Start is
  189.  
  190.     task T1;
  191.  
  192.     task body T1 is
  193.       e1: integer;
  194.       a1: integer;
  195.     begin
  196.       put_line("Process T1 started");
  197.       MatrixO := fill_matrix(1);
  198.       e:=1;
  199.       put_line("Process T1 filled");
  200.       Set_True(Sem1);
  201.  
  202.       Suspend_Until_True(Sem2);
  203.  
  204.       Suspend_Until_True(Skd);
  205.       e1:=e;
  206.       a1 := a;
  207.       Set_True(Skd);
  208.  
  209.       --computations
  210.       put_line("Process T1 can compute");
  211.  
  212.       Multiply_Half_Matrix_By_Matrix(MatrixK, MatrixR, 0, Matrix);
  213.       multiply_half_matrix_by_number(Matrix, e1, 0, Right);
  214.       multiply_half_matrix_by_number(MatrixO, a1, 0, Left);
  215.       add_half_matrix_to_matrix(Left, Right, 0, MatrixA);
  216.  
  217.       Suspend_Until_True(Sem3);
  218.  
  219.     --output
  220.     if N < 30 then
  221.       print_matrix(MatrixA);
  222.     end if;
  223.       put_line("Process T1 finished");
  224.     end T1;
  225.  
  226.     task T2;
  227.  
  228.     task body T2 is
  229.       a2: integer;
  230.       e2: integer;
  231.     begin
  232.       put_line("Process T2 started");
  233.       MatrixK := fill_matrix(1);
  234.       MatrixR := fill_matrix(1);
  235.       a := 1;
  236.       put_line("Process T2 filled");
  237.       Set_true(Sem2);
  238.       Suspend_Until_True(Sem1);
  239.  
  240.       Suspend_Until_True(Skd);
  241.       e2 := e;
  242.       a2 := a;
  243.       Set_true(Skd);
  244.       --computations
  245.       put_line("Process T2 can compute");
  246.       Multiply_Half_Matrix_By_Matrix(MatrixK, MatrixR, 1, Matrix);
  247.       multiply_half_matrix_by_number(Matrix, e2, 1, Right);
  248.       multiply_half_matrix_by_number(MatrixO, a2, 1, Left);
  249.       add_half_matrix_to_matrix(Left, Right,1, MatrixA);
  250.  
  251.       Set_True(Sem3);
  252.       put_line("Process T2 finished");
  253.     end T2;
  254.   begin
  255.     null;
  256.   end Task_Start;
  257. begin
  258.   put_line("main procedure started");
  259.   Set_True(Skd);
  260.   Task_Start;
  261.  
  262. end Lab1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement