Локальные параллельные вычисления с использованием потоков

Автор: Пользователь скрыл имя, 22 Октября 2011 в 01:55, лабораторная работа

Описание работы

Цель работы: изучить принципы построения Windows приложения реализующего параллельные вычисления с использованием потоков (threads) в рамках одного процесса средствами WinAPI или MFC.

Работа содержит 1 файл

ПП1.doc

— 519.50 Кб (Скачать)

Министерство образования и науки, молодежи и спорта Украины

Государственное высшее учебное заведение

Национальный горный университет

Институт электроэнергетики

Факультет информационных технологий

 

Кафедра АКС

 
 

Лабораторная  работа №1

Локальные параллельные вычисления с использованием потоков.  

                    Выполнил:

                              

                    Проверили:

                                                      
 
 
 
 
 
 
 
 
 
 
 

Днепропетровск

2011

 

Лабораторная работа №1

Локальные параллельные вычисления с использованием потоков.  

     Цель  работы: изучить принципы построения Windows приложения реализующего параллельные вычисления с использованием потоков (threads) в рамках одного процесса средствами WinAPI или MFC. 

    Задание.

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

  1. Вычисление значения определенного интеграла в одном процессе с измерением времени вычисления с точностью до миллисекунд. Вычисление точного значения определенного интеграла с использованием первообразной функции. Определение точности (погрешности) вычисления Е.

    В качестве результатов вывести значение интеграла, точное значение интеграла, значение точности Е и время вычисления.

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

    В качестве результатов вывести значение интеграла, точное значение интеграла, значение точности Е и время вычисления.

    Сравнить  и пояснить результаты в первом и втором случаях. 

9
Симпсона
 

     Скриншоты работы программы

     

     Рис.1 – Работа вычисления интеграла с 2умя потоками. 

     

     Рис.2 – Работа вычисления интеграла с 1ним потоком. 
Блок-схема работы программы:
 

Рис. 1 –  Блок-схема работы программы 

Листинг программы 

// parallel1Dlg.cpp : файл  реализации

//

#include<windows.h>

#include "stdafx.h"

#include<stdio.h>

#include<iostream>

#include "parallel1.h"

#include "parallel1Dlg.h"

#include<math.h>

#include <process.h> 

//#include<omp.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#endif 

int lol;

double t;

int ololo; 
 

void Thread( void* pParams)      //поток

  {

        t=0; ololo=lol-1;

        double a=1, b=2.5;

double h=(b-a)/(lol);

        for(int i=1;i<(lol)-1;i+=2)

        {t=t+(1/pow(a+h*i,2))*sin(1/(a+h*i));

        ololo-=2;}

     _endthreadex( 0 );

  } 

 

double func(double Hi, double n)

{int i;

double result=0;

      for( i=1;i<n-1;i+=2)

      { double g=i;

             result=result+ 4*((1/pow((1+g*Hi),2))*sin(1/(1+g*Hi)))+2*((1/pow((1+(g+1)*Hi),2))*sin(1/(1+(g+1)*Hi)));

      } 

      return result;

} 

Cparallel1Dlg::Cparallel1Dlg(CWnd* pParent /*=NULL*/)

      : CDialog(Cparallel1Dlg::IDD, pParent)

      , m_n(1000000)

      , m_f(0)

      , m_i(0)

      , m_time(0)

{

      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

} 

void Cparallel1Dlg::DoDataExchange(CDataExchange* pDX)

{

      CDialog::DoDataExchange(pDX);

      DDX_Text(pDX, IDC_EDIT1, m_n);

      DDX_Text(pDX, IDC_EDIT2, m_f);

      DDX_Text(pDX, IDC_EDIT4, m_i);

      DDX_Text(pDX, IDC_EDIT3, m_time);

} 

BEGIN_MESSAGE_MAP(Cparallel1Dlg, CDialog)

      ON_WM_PAINT()

      ON_WM_QUERYDRAGICON()

      ON_BN_CLICKED(IDC_BUTTON1, &Cparallel1Dlg::OnBnClickedButton1)

      ON_BN_CLICKED(IDC_BUTTON2, &Cparallel1Dlg::OnBnClickedButton2)

END_MESSAGE_MAP() 

BOOL Cparallel1Dlg::OnInitDialog()

{

      CDialog::OnInitDialog(); 

      SetIcon(m_hIcon, TRUE);   // Крупный значок

      SetIcon(m_hIcon, FALSE);  // Мелкий значок 

      // TODO: добавьте дополнительную инициализацию 

      return TRUE;  // возврат значения TRUE, если  фокус не передан элементу  управления

} 

void Cparallel1Dlg::OnPaint()

{

      if (IsIconic())

      {

            CPaintDC dc(this); // контекст  устройства для рисования 

            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 

            // Выравнивание значка  по центру клиентского прямоугольника

            int cxIcon = GetSystemMetrics(SM_CXICON);

            int cyIcon = GetSystemMetrics(SM_CYICON);

            CRect rect;

            GetClientRect(&rect);

            int x = (rect.Width() - cxIcon + 1) / 2;

            int y = (rect.Height() - cyIcon + 1) / 2; 

            // Нарисуйте значок

            dc.DrawIcon(x, y, m_hIcon);

      }

      else

      {

            CDialog::OnPaint();

      }

} 

// Система вызывает  эту функцию для получения  отображения курсора при перемещении

//  свернутого  окна.

HCURSOR Cparallel1Dlg::OnQueryDragIcon()

{

      return static_cast<HCURSOR>(m_hIcon);

} 
 

void Cparallel1Dlg::OnBnClickedButton1()

{

      DWORD timer2;

double a=1.0 , b=2.5;

      DWORD timer = GetTickCount();

        

       

       UpdateData(TRUE);

       double f=cos(1/2.5)-cos(1.0);//-cos(1/a)+cos(1.0);

       double h=(b-a)/m_n;

       double g=func(h,m_n);

       int n=1.5/pow((0.18/1.5),0.25);

       double integral1=(h/3)*((1/pow(a,2))*sin(1/a)-(1/pow(b,2))*sin(1/b)+g-(pow(h,5)*0.017*1.5)/180);

       

           

       m_f=f;

       m_i=integral1;

       timer2= GetTickCount();

             m_time= timer2-timer;

       

       UpdateData(FALSE);

       

 

  UpdateData(FALSE);

      // TODO: добавьте свой код обработчика  уведомлений

} 

void Cparallel1Dlg::OnBnClickedButton2()

      UpdateData(TRUE);

      lol=m_n;

      _beginthread(Thread,0,NULL );

      DWORD timer2, timer = GetTickCount();

      double g=0, a=1.0 , b=2.5; 

      double h=(b-a)/m_n;

       WaitForSingleObject( Thread, INFINITE ); 
 

      double f=cos(1/2.5)-cos(1.0); 
 

      for(int i=1;i<m_n-1;i+=2)

       g=g+(1/pow(a+h*i,2))*sin(1/(a+h*i));

      //while(&Thread);

      double integral1=0;

      // CloseHandle(Thread);

bool error4=0;

      while (error4==FALSE)

      {if(GetExitCodeThread(Thread,0)==TRUE)

      {integral1=(h/3)*((1/pow(a,2))*sin(1/a)+(1/pow(b,2))*sin(1/b)+4*g+2*t-(pow(h,5)*1.5*0.017)/180);

      error4=TRUE; } 

      }

      m_f=f;

       

       m_i=integral1;

       timer2= GetTickCount();

             m_time= timer2-timer;

              UpdateData(FALSE);   

                } 
 

     Выводы: написал программу для сравнения  скорости одно- и многопоточного вычисления интеграла в соответствии со своим вариантом.

Информация о работе Локальные параллельные вычисления с использованием потоков