Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра параллельных вычислительных технологий
Лабораторная работа №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>
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.