Распараллеливание вычислительных алгоритмов

Автор работы: Пользователь скрыл имя, 27 Мая 2013 в 21:11, практическая работа

Краткое описание

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

Содержание

Введение 3
1 Теоретические предпосылки поставленной проблемы 5
2 Разработка программного средства 12
2.1 Постановка задачи 12
2.2 Спецификация основных процедур и функций 13
2.3 Спецификация данных 14
2.3.1 Структура входных данных 15
2.4 Разработка алгоритма решения задачи 15
2.4.1 Укрупненная схема алгоритма программного средства 15
2.5 Установка и эксплуатация программного средства 16
2.6 Работа с программным средством 16
Заключение 19
Список использованных источников 20
Приложение А – Текст программы 21
Приложение Б – Контрольный пример 31

Вложенные файлы: 1 файл

Отчет РГЗ по ТВП (вариант 4).doc

— 586.50 Кб (Скачать файл)

- манипулятор типа «мышь».

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

 

2.6 Работа с программным  средством

 

Для запуска программы необходимо запустить исполняемый файл «TVP.exe», при этом откроется окно программы, представленное на рисунке 8.

 

 

Рисунок 8 – Вкладка «Граф-схема»

 

Интерфейс программы представлен вкладками.

На вкладке «Граф-схема» содержатся элементы создания и редактирования граф-схемы.

Вершины граф-схемы создаются путем двойного щелчка мышью области графического представления данных на вкладке «Граф-схема».

Перемещение вершин осуществляется в соответствии с концепцией DragNDrop и аналогично перетаскиванию папок в проводнике Windows.

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

Связь по информации создается  при выбранном переключателе «Связь по информации». Связь по управлению - при выборе переключателя «Связь по управлению».

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

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

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

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

По завершении построения можно  составить диаграмму сроков выполнения операторов. Для просмотра ранних сроков выполнения достаточно выбрать вкладку «Диаграмма сроков».

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

 

Заключение

 

Выполнение целей и  задач РГР позволило закрепить  теоретические знания в области теории распараллеливания вычислительных алгоритмов

Было разработано программное средство распараллеливания вычислительных алгоритмов, выполняющее функции:

- ввода и редактирования информационно-логической графа-схемы вычислительного алгоритма;

- нахождение транзитивных связей и связей логической несовместимости операторов;

- нахождение транзитивных связей логической несовместимости операторов

- нахождение матрицы независимости операторов;

- нахождение ранних и поздних сроков окончания выполнения операторов для конкретной ветви алгоритма;

- построение диаграммы выполнения операторов для конкретной ветви алгоритма.

 

Список использованных источников

 

  1. Ишакова, Е.Н.: Теория вычислительных процессов: учебное пособие. – Оренбург:ГОУ ОГУ, 2007. –160с.
  2. Либерти, Д.: Программирование на C#.–Пер. с англ..– СПб:Символ-Плюс, 2003.– 688с.
  3. Троелсен, Э. Язык программирования С# 2005 и платформа .NET 2.0. Пер. с анг. – М.-СПб.-Киев.: “Вильямс”.–  2007 г. – 1168 стр.
  4. Петцольд, Ч. Программирование для Microsoft Windows на C#. В 2-х томах, Том 1-2.– Пер. с англ.–М: Издательско-торговый дом “Русская редакция”, 2002
  5. Марченко, А.Л. Основы программирования на C# 2.0 – М.: “Интернет-университет информационных технологий – ИНТУИТ.ру”, “БИНОМ. Лаборатория знаний” – 2007 г. – 552 стр.

 

Приложение А – Текст  программы

 

Класс реализации формы

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication2

{

    public partial class Form1 : Form

    {

 

        public bool mode=true;

        public Form1()

        {

            InitializeComponent();

            nod = new Node(26,this);

          

        }

      

        private void OutS()

        {

            try

            {

                dataGridView1.RowCount = nod.Get_size()+1;

                dataGridView1.ColumnCount = nod.Get_size()+1;

                for (int i = 1; i < nod.Get_size()+1; i++)

                    for (int j = 1; j < nod.Get_size()+1; j++)

                        dataGridView1.Rows[i].Cells[j].Value = nod.S[i, j];

                dataGridView1.AutoResizeColumns();

            }

            catch

            { return; }           

        }

        private void OutL()

        {

            try

            {

                dataGridView2.RowCount = nod.Get_size() + 1;

                dataGridView2.ColumnCount = nod.Get_size() + 1;

                for (int i = 1; i < nod.Get_size() + 1; i++)

                    for (int j = 1; j < nod.Get_size() + 1; j++)

                        dataGridView2.Rows[i].Cells[j].Value = nod.L[i, j];

                dataGridView2.AutoResizeColumns();

            }

            catch

            { return; }

        }

        private void OutN()

        {

            try

            {

                dataGridView3.RowCount = nod.Get_size() + 1;

                dataGridView3.ColumnCount = nod.Get_size() + 1;

                for (int i = 1; i < nod.Get_size() + 1; i++)

                    for (int j = 1; j < nod.Get_size() + 1; j++)

                        dataGridView3.Rows[i].Cells[j].Value = nod.N[i, j];

                dataGridView3.AutoResizeColumns();

            }

            catch

            { return; }

        }

        private void button1_Click(object sender, EventArgs e)

        {

 

            int late = (int)numericUpDown1.Value;

            int f = nod.FindFT();

            if (f > late)

            {

                MessageBox.Show("Поздние сроки не могут быть меньше " + f.ToString()+".");

                return;

            }

            isLate = false;

            nod.FindLT(late);

            tabControl1.SelectTab(4);           

 

        }

 

 

        private Node nod;

        private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)

        {

            nod.Add(new Point(100, 100));

        }

 

        private void pictureBox1_Paint(object sender, PaintEventArgs e)

        {

            nod.Draw(e.Graphics);

           

           

        }

 

        private void timer1_Tick(object sender, EventArgs e)

        {

            //pictureBox1_Paint(sender,null);

            pictureBox1.Refresh();

            nod.Fill_S();

            nod.Fill_L();

            nod.Fill_N();

            OutS();

            OutL();

            OutN();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            pictureBox1.Click += new EventHandler(nod.Node_Click);

            pictureBox1.DoubleClick += new EventHandler(nod.Node_DbClick);

            pictureBox1.MouseDown += new MouseEventHandler(nod.Node_MD);

            pictureBox1.MouseUp+=new MouseEventHandler(nod.Node_MU);

            pictureBox1.MouseMove+= new MouseEventHandler(nod.Node_MV);

        }

 

        private void button2_Click(object sender, EventArgs e)

        {

            nod.Add(new Point(100, 100));

           

        }

 

        private void radioButton1_CheckedChanged(object sender, EventArgs e)

        {

            mode = radioButton1.Checked;

        }

 

        private void tabPage1_Click(object sender, EventArgs e)

        {

 

        }

 

        private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)

        {

            if (e.TabPageIndex == 4)

            {

                nod.FindFT();

                nod.FindLT((int)numericUpDown1.Value);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                pictureBox2.Refresh();

            }

            else isLate = true;

            if (e.TabPageIndex == 5)

            {

               // nod.Renum();

                try

                {

                    dataGridView4.RowCount = nod.Get_size() + 1;

                    dataGridView4.ColumnCount = nod.Get_size() + 1;

                    for (int i = 1; i < nod.Get_size() + 1; i++)

                    {

                        for (int j = 1; j < nod.Get_size() + 1; j++)

                        {

                            dataGridView4.Rows[i].Cells[j].Value = nod.mtr[i, j];

                            dataGridView4.Columns[j].HeaderCell.Value = j.ToString();

                        }

 

                        dataGridView4.Rows[i].HeaderCell.Value = i.ToString();

                    }

                   

                    dataGridView4.AutoResizeColumns();

                }

                catch

                { return; }

            }

        }

 

        private bool isLate=true;

        private void pictureBox2_Paint(object sender, PaintEventArgs e)

        {

            int X0, Y0,dy=40;

            X0 = 20;

            Y0 = pictureBox2.Height - 20;

            Pen pn = new Pen(Color.Black, 4);

            Pen p2 = new Pen(Color.Black, 2);

            Font f=new Font("Arial",10);

         

            e.Graphics.DrawLine(pn, X0, Y0, pictureBox2.Width - 20, Y0);

            int dx;

            if (isLate) dx = nod.FindFT(); else dx =(int) numericUpDown1.Value;

             int nx;

            if(dx>0)nx= (pictureBox2.Width - 40) / dx;else nx=pictureBox2.Width-40;

            for (int x = X0, i = 0;i<=dx; x += nx, i++)

                e.Graphics.DrawString(i.ToString(), f, Brushes.Black, new PointF(x, Y0 + 5));

 

            int[,] grf = new int[10, dx+1];

            bool flag;

            for (int i = 1; i < nod.Get_size()+1; i++,flag=false)

            {

                if (!nod.nd[i - 1].selected) continue;

                int end, start;

                if (isLate)

                {

                    end = nod.Tau[i];

                    start = end - nod.T[i];

                }

                else

                {

                    end = nod.LTau[i];

                    start = end - nod.T[i];

                }

                int level = 1;

                do

                {

                    flag = false;

                    while (grf[level, start] != 0) level++;

                    for (int s = start; s < end; s++)

                        if (grf[ level,s] != 0)

                        {

                            level++;

                            flag = true;

                        }

                } while (flag);

 

                e.Graphics.FillRectangle(Brushes.Green, new Rectangle(X0+start * nx, Y0-level * dy, nx * (end - start), dy));

                e.Graphics.DrawRectangle(p2, new Rectangle(X0+start * nx, Y0 - level * dy, nx * (end - start), dy));

                e.Graphics.DrawString(i.ToString(), f, Brushes.Yellow, new PointF(X0+start * nx+nx * (end - start)/2, Y0-level * dy+dy/2));

                for (int s = start; s < end; s++) grf[level, s] = 1;

Информация о работе Распараллеливание вычислительных алгоритмов