Умножение матрицы на вектор последовательным алгоритмом с измерением времени выполнения (на языке C)
|
Данная программа реализует последовательный (непараллельный) алгоритм умножения матрицы на вектор, при этом измеряется время, за которое выполнился расчёт по заданному алгоритму на компьютере, выполняющего вычисления.
Вектор и матрица создаются с использованием генератора случайных чисел типа double. Время, затраченное на этот процесс не учитывается в подсчитанном итоговом времени. Размер вектора и матрицы задаётся пользователем при запуске программы. Код программы на языке C: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <time.h> // Function that converts numbers form LongInt type to double type double LiToDouble (LARGE_INTEGER x) { double result = ((double)x.HighPart) * 4.294967296E9 + (double)((x).LowPart); return result; } // Function that gets the timestamp in seconds double GetTime() { LARGE_INTEGER lpFrequency, lpPerfomanceCount; QueryPerformanceFrequency (&lpFrequency); QueryPerformanceCounter (&lpPerfomanceCount); return LiToDouble(lpPerfomanceCount)/LiToDouble(lpFrequency); } // Function for simple definition of matrix and vector elements void DummyDataInitialization (int* pMatrix, int* pVector, int Size) { int i, j; // Loop variables for (i=0; i<Size; i++) { pVector[i] = 1; for (j=0; j<Size; j++) pMatrix[i*Size+j] = i; } } // Function for random definition of matrix and vector elements void RandomDataInitialization(int* pMatrix, int* pVector, int Size) { int i, j; // Loop variables srand(unsigned(clock())); for (i=0; i<Size; i++) { pVector[i] = rand(); for (j=0; j<Size; j++) pMatrix[i*Size+j] = rand(); } } // Function for memory allocation and definition of object’s elements void ProcessInitialization (int* &pMatrix, int* &pVector, int* &pResult, int &Size) { // Size of initial matrix and vector definition do { printf("\nEnter size of the initial objects: "); scanf("%d", &Size); printf("\nChosen objects size = %d\n", Size); if (Size <= 0) printf("\nSize of objects must be greater than 0!\n"); } while (Size <= 0); // Memory allocation pMatrix = new int [Size*Size]; pVector = new int [Size]; pResult = new int [Size]; // Definition of matrix and vector elements DummyDataInitialization(pMatrix, pVector, Size); } // Function for formatted matrix output void PrintMatrix (int* pMatrix, int RowCount, int ColCount) { int i, j; // Loop variables for (i=0; i<RowCount; i++) { for (j=0; j<ColCount; j++) printf("%7.4f ", pMatrix[i*RowCount+j]); printf("\n"); } } // Function for formatted vector output void PrintVector (int* pVector, int Size) { int i; for (i=0; i<Size; i++) printf("%7.4f ", pVector[i]); } // Function for matrix-vector multiplication void ResultCalculation(int* pMatrix, int* pVector, int* pResult, int Size) { int i, j; // Loop variables for (i=0; i<Size; i++) { pResult[i] = 0; for (j=0; j<Size; j++) pResult[i] += pMatrix[i*Size+j]*pVector[j]; } } // Function for computational process termination void ProcessTermination(int* pMatrix,int* pVector,int* pResult) { delete [] pMatrix; delete [] pVector; delete [] pResult; } int main() { int* pMatrix; // The first argument - initial matrix int* pVector; // The second argument - initial vector int* pResult; // Result vector for matrix-vector multiplication int Size; // Sizes of initial matrix and vector double Start, Finish, Duration; printf("Serial matrix-vector multiplication program\n"); // Memory allocation and definition of objects' elements ProcessInitialization(pMatrix, pVector, pResult, Size); // Matrix and vector output //printf ("Initial Matrix \n"); //PrintMatrix(pMatrix, Size, Size); //printf("Initial Vector \n"); //PrintVector(pVector, Size); // Matrix-vector multiplication Start = GetTime(); ResultCalculation(pMatrix, pVector, pResult, Size); Finish = GetTime(); Duration = Finish-Start; // Printing the result vector printf ("\n Result Vector: \n"); //PrintVector(pResult, Size); // Printing the time spent by matrix-vector multiplication printf("\n Time of execution: %f\n", Duration); // Computational process termination ProcessTermination(pMatrix, pVector, pResult); return 0; } Добавил: mauzer (10.07.2011) | Категория: Язык Си (консольные) Просмотров: 3794 | Загрузок: 0 | Рейтинг: 0.0/0 | |
| Комментарии (0) | |