Последовательный и параллельный варианты программы. Теоретическое и практическое ускорение параллельной программы

Страницы работы

Содержание работы

Новосибирский государственный технический университет

Кафедра параллельных вычислительных технологий

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

по теме: “Архитектура ЭВМ и вычислительных систем

Факультет: ПМИ

Группа: ПМ-71

Студент: Гурьева А., Данилова И.

Проверил: Куликов И.М.

Новосибирск

2008

Задание

1.  Разобрать последовательный вариант программы.

2.  Реализовать параллельный вариант программы с использованием библиотеки OpenMP. Функция решения СЛАУ должна находиться в параллельном регионе.

3.  Посчитать теоретическое и практическое ускорение параллельной программы.


Текст программы

// sss.cpp : Defines the entry point for the console application.

//

/*

   Решение тепловой задачи

   Структура входного файла param.dat:

    - размер области по оси x

    - размер области по оси y

    - количество элементов по оси x

    - количество элементов по оси y

    - x координата нижнего левого угла инородного элемента

    - y координата нижнего левого угла инородного элемента

    - x координата верхнего правого угла инородного элемента

    - y координата верхнего правого угла инородного элемента

    - значение коэффициента теплопроводности для области

    - значение коэффициента теплопроводности для элемента

    - значение источника для элемента

   Пример param.dat

   1.0 1.0

   100 100

   0.0 0.2 0.5 0.4

   1.0 10.0

   1.0

*/

#include <stdio.h>

#include "imvlparam.h"

#include <stdlib.h>

#include <time.h>

#include <conio.h>

int jk=0,mk=0;

/* Параметры задачи */

real     sx, sy;            // размер области

integer  nx, ny;            // количество элементов

real     dx1, dy1, dx2, dy2;// прямоугольник инородного объекта

real     muSpace, muObject; // теплопроводности объекта и области

real     hx, hy;            // шаги по осям

real  qt;                // источник тепла

/* Коэффициент теплопроводности */

real GetMu(real x, real y)

{

        if( dx1<=x && x<=dx2 && dy1<=y && y<=dy2 ) return muObject;

        return muSpace;

}

/* Источник тепла */

real GetF(real x, real y)

{

        if( dx1<=x && x<=dx2 && dy1<=y && y<=dy2 ) return qt;

        return 1.0;

}

/* Основная функция */

int main()

{   float start;

start = clock();

        /* Локальные переменные */

        integer i, k, n1, n2, n3, n4;

        real hx2, hy2, tmp, u1, u2, u3, ud, mu, f1, f2, f3,f4;

        real B[4][4], C[4][4], F[4];

        FILE* FSolve;

        /* Чтение параметров задачи */

        FILE *FParam = fopen("param.dat","r");

        fscanf(FParam,"%lf %lf",&sx,&sy);

        fscanf(FParam,"%d %d",&nx,&ny);

        fscanf(FParam,"%lf %lf %lf %lf",&dx1,&dy1,&dx2,&dy2);

        fscanf(FParam,"%lf %lf",&muSpace,&muObject);

        fscanf(FParam,"%lf",&qt);

        hx = sx/(real)nx;

        hy = sy/(real)ny;

        hx2 = hx*hx;

        hy2 = hy*hy;

        fclose(FParam);

        /* Создание матрицы */

        IMVL_CreateMatrix((nx+1)*(ny+1),4194304,1.0e-30);

        /* Построение портрета матрицы */

        for(i=0 ; i<nx ; i++)

          for(k=0 ; k<ny ; k++)

          {

                /* Нахождение опорной точки */

            n1 = k*(nx+1)+i;

            n2 = k*(nx+1)+i+1;

            n3 = (k+1)*(nx+1)+i;

            n4 = (k+1)*(nx+1)+i+1;

            /* Создание элементов матрицы */

            IMVL_CreateElement(n1,n1);

            IMVL_CreateElement(n1,n2);

            IMVL_CreateElement(n1,n3);

            IMVL_CreateElement(n1,n4);

            IMVL_CreateElement(n2,n1);

            IMVL_CreateElement(n2,n2);

            IMVL_CreateElement(n2,n3);

            IMVL_CreateElement(n2,n4);

            IMVL_CreateElement(n3,n1);

            IMVL_CreateElement(n3,n2);

            IMVL_CreateElement(n3,n3);

            IMVL_CreateElement(n3,n4);

            IMVL_CreateElement(n4,n1);

            IMVL_CreateElement(n4,n2);

            IMVL_CreateElement(n4,n3);

            IMVL_CreateElement(n4,n4);

          }

        /* Достроим портрет */

        IMVL_CreatePortrait();

        /* Формирование матрицы жёсткости */

        tmp = 1.0/(hx*hy);

        ud = (hx2+hy2)*tmp/3.0;

        u1 = (hx2-2.0*hy2)*tmp/6.0;

        u2 =-(2.0*hx2-hy2)*tmp/6.0;

        u3 =-(hx2+hy2)*tmp/6.0;

        B[0][0] = ud; B[0][1] = u1; B[0][2] = u2; B[0][3] = u3;

Похожие материалы

Информация о работе