Автор: Пользователь скрыл имя, 22 Октября 2011 в 01:55, лабораторная работа
Цель работы: изучить принципы построения Windows приложения реализующего параллельные вычисления с использованием потоков (threads) в рамках одного процесса средствами WinAPI или MFC.
Министерство образования и науки, молодежи и спорта Украины
Государственное высшее учебное заведение
Национальный горный университет
Институт электроэнергетики
Факультет информационных технологий
Кафедра АКС
Лабораторная работа №1
Локальные
параллельные вычисления
с использованием потоков.
Выполнил:
Проверили:
Днепропетровск
2011
Лабораторная работа №1
Локальные
параллельные вычисления
с использованием
потоков.
Цель
работы: изучить принципы построения
Windows приложения реализующего параллельные
вычисления с использованием потоков
(threads) в рамках одного процесса средствами
WinAPI или MFC.
Задание.
Составить схему алгоритма и программу на языке С++ реализующую следующие функции:
В качестве результатов вывести значение интеграла, точное значение интеграла, значение точности Е и время вычисления.
В качестве результатов вывести значение интеграла, точное значение интеграла, значение точности Е и время вычисления.
Сравнить
и пояснить результаты в первом и втором
случаях.
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/(
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/(
}
return result;
}
Cparallel1Dlg::Cparallel1Dlg(
: CDialog(Cparallel1Dlg::IDD, pParent)
, m_n(1000000)
, m_f(0)
, m_i(0)
, m_time(0)
{
m_hIcon
= AfxGetApp()->LoadIcon(IDR_
}
void Cparallel1Dlg::DoDataExchange(
{
CDialog::DoDataExchange(
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(
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_
ON_BN_CLICKED(IDC_
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_
// Выравнивание значка
по центру клиентского
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&
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::
{
return static_cast<HCURSOR>(m_hIcon);
}
void Cparallel1Dlg::
{
DWORD timer2;
double a=1.0 , b=2.5;
DWORD timer = GetTickCount();
UpdateData(TRUE);
double f=cos(1/2.5)-cos(1.0);//-cos(
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))*
m_f=f;
m_i=integral1;
timer2= GetTickCount();
m_time= timer2-timer;
UpdateData(FALSE);
UpdateData(FALSE);
// TODO: добавьте свой код обработчика уведомлений
}
void Cparallel1Dlg::
{
UpdateData(TRUE);
lol=m_n;
_beginthread(Thread,0,
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+
//while(&Thread);
double integral1=0;
// CloseHandle(Thread);
bool error4=0;
while (error4==FALSE)
{if(GetExitCodeThread(
{integral1=(h/3)*((1/
error4=TRUE;
}
}
m_f=f;
m_i=integral1;
timer2= GetTickCount();
m_time= timer2-timer;
UpdateData(FALSE);
}
Выводы:
написал программу для
Информация о работе Локальные параллельные вычисления с использованием потоков