Умножение матрицы на вектор последовательным алгоритмом с измерением времени выполнения (на языке 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) | Категория: Язык Си (консольные) Просмотров: 3700 | Загрузок: 0 | Рейтинг: 0.0/0 | |
Комментарии (0) | |