Разработка параллельных программ для основных операций линейной алгебры для архитектур с общей памятью с использованием библиотеки OpenMP (Лабораторная работа № 4)

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

Фрагмент текста работы

Министерство образования и науки РФ

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

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

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

по дисциплине:

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

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

Группа                           ПМ-93

Студент                         Трубников А.И.

Преподаватель          Куликов И. М.

Новосибирск 2010

Задание

Цель работы:

Разработать параллельные программы для основных операций линейной алгебры для архитектур с общей памятью с использованием библиотеки OpenMP.

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

·  умножения матрицы на матрицу,

·  сложение матриц,

·  умножение матрицы на число.

2.  Реализовать параллельные варианты программ с использованием библиотеки OpenMP.

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

Характеристика компьютера

Процессор: Pentium(R) Dual-Core CPU T4200 2.00 GHz

ОЗУ: 3 GB

ОС: Windows 7 Профессиональная

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

Без использования OpenMP:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <windows.h>

#include <time.h>

#define N 4500

float** allocatingMemory()

{

      float** matrix;

      matrix = (float**)malloc(N * sizeof(float));

      for (int i = 0; i < N; i++)

            matrix[i] = (float*)malloc(N * sizeof(float));

      return matrix;

}

void freeMemory(float** matrix)

{

      for (int i = 0; i < N; i++)

            free(matrix[i]);

      free(matrix);

}

float** sumMatrix(float** matrix_1, float** matrix_2, DWORD* time)

{

      float** result;

      int i, j;

      result = (float**)malloc(N * sizeof(float));

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

            result[i] = (float*)malloc(N * sizeof(float));

      *time = GetTickCount();

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

                  for (j = 0; j < N; j++)

                        result[i][j] = matrix_1[i][j] + matrix_2[i][j];

      *time = GetTickCount() - *time;

      return result;

}

float** multMatrix(float** matrix_1, float** matrix_2, DWORD* time)

{

      float** result;

      int i, j, k;

      result = (float**)malloc(N * sizeof(float));

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

            result[i] = (float*)malloc(N * sizeof(float));

      *time = GetTickCount();

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

                  for (j = 0; j < N; j++)

                  {

                        result[i][j] = 0;

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

                              result[i][j] += matrix_1[i][k] * matrix_2[k][j];

                  }

      *time = GetTickCount() - *time;

      return result;

}

float** multNumber(float** matrix_1, float number, DWORD* time)

{

      float** result;

      int i, j;

      result = (float**)malloc(N * sizeof(float));

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

            result[i] = (float*)malloc(N * sizeof(float));

      *time = GetTickCount();

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

                  for (j = 0; j < N; j++)

                        result[i][j] = matrix_1[i][j] * number;

      *time = GetTickCount() - *time;

      return result;

}

void inputMatrix(float** matrix)

{

      int i, j;

      srand(time(NULL));

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

      {

            for (j = 0; j < N; j++)

                  matrix[i][j] = rand();

      }

}

int main()

{

      float **A, **B, **C, **D, **E;

      float num = 50;

      DWORD time1, time2, time3;

      A = allocatingMemory();

      B = allocatingMemory();

      C = allocatingMemory();

      D = allocatingMemory();

      E = allocatingMemory();

      inputMatrix(A);

      inputMatrix(B);

      C = sumMatrix(A, B, &time1);

      D = multMatrix(A, B, &time2);

      E = multNumber(A, num, &time3);

      printf("%d\n", time1);

      printf("%d\n", time2);

      printf("%d", time3);

      freeMemory(A);

      freeMemory(B);

      freeMemory(C);

      freeMemory(D);

      freeMemory(E);

      _getch();

      return 0;

}

С использованием OpenMP:

#include <stdio.h>

#include <conio.h>

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

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