Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <stdio.h>
- #include <time.h>
- #include <windows.h>
- #include <cstdlib>
- #include "omp.h"
- #define USE_MULTIPLE_THREADS true
- #define MAXTHREADS 128
- int NumThreads;
- double start;
- using namespace std;
- static const int ROWS = 1000; // liczba wierszy macierzy
- static const int COLUMNS = 1000; // lizba kolumn macierzy
- float matrix_a[ROWS][COLUMNS]; // lewy operand
- float matrix_b[ROWS][COLUMNS]; // prawy operand
- float matrix_r[ROWS][COLUMNS]; // wynik
- float matrix_r2[ROWS][COLUMNS];
- FILE *result_file;
- void initialize_matrices()
- {
- // zdefiniowanie zawarosci poczatkowej macierzy
- //#pragma omp parallel for
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < COLUMNS; j++) {
- matrix_a[i][j] = (float)rand() / RAND_MAX;
- matrix_b[i][j] = (float)rand() / RAND_MAX;
- matrix_r[i][j] = 0.0;
- }
- }
- }
- void initialize_matricesZ()
- {
- // zdefiniowanie zawarosci poczatkowej macierzy
- //#pragma omp parallel for
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < COLUMNS; j++) {
- matrix_r[i][j] = 0.0;
- matrix_r2[i][j] = 0.0;
- }
- }
- }
- void print_result()
- {
- // wydruk wyniku
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < COLUMNS; j++) {
- fprintf(result_file, "%6.4f ", matrix_r[i][j]);
- }
- fprintf(result_file, "\n");
- }
- }
- bool result_match() {
- for (int i = 0; i < ROWS; i++)
- for (int j = 0; j < COLUMNS; j++)
- if (matrix_r[i][j] != matrix_r2[i][j])
- return false;
- return true;
- }
- void multiply_matrices_Seq()
- {
- for (int i = 0; i < ROWS; i++) {
- for (int j = 0; j < COLUMNS; j++) {
- for (int k = 0; k < COLUMNS; k++) {
- matrix_r2[i][j] = matrix_a[i][k] * matrix_b[k][j];
- }
- }
- }
- }
- /*
- void multiply_matrices_JIK()
- {
- // mnozenie macierzy
- #pragma omp parallel for
- for (int j = 0; j < COLUMNS; j++) {
- for (int i = 0; i < ROWS; i++) {
- float sum = 0.0;
- for (int k = 0; k < COLUMNS; k++) {
- sum += matrix_a[i][k] * matrix_b[k][j];
- }
- matrix_r[i][j] = sum;
- }
- }
- }
- */
- ///*
- void multiply_matrices_JIK()
- {
- // mnozenie macierzy
- #pragma omp parallel for
- for (int j = 0; j < COLUMNS; j++) {
- for (int i = 0; i < ROWS; i++) {
- for (int k = 0; k < COLUMNS; k++) {
- matrix_r[i][j] = matrix_a[i][k] * matrix_b[k][j];
- }
- }
- }
- }
- //*/
- void multiply_matrices_ijk_ikj(int r = 50) {
- #pragma omp parallel for
- for (int i = 0; i < ROWS; i += r)
- for (int j = 0; j < COLUMNS; j += r)
- for (int k = 0; k < COLUMNS; k += r)
- for (int ii = i; ii < i + r; ii++)
- for (int kk = k; kk < k + r; kk++)
- for (int jj = j; jj < j + r; jj++)
- matrix_r2[ii][jj] += matrix_a[ii][kk] * matrix_b[kk][jj];
- }
- void print_elapsed_time()
- {
- double elapsed;
- double resolution;
- // wyznaczenie i zapisanie czasu przetwarzania
- elapsed = (double)clock() / CLK_TCK;
- resolution = 1.0 / CLK_TCK;
- printf("Czas: %8.4f sec \n",
- elapsed - start);
- fprintf(result_file,
- "Czas wykonania programu: %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
- elapsed - start, resolution);
- }
- int main(int argc, char* argv[])
- {
- // start = (double) clock() / CLK_TCK ;
- if ((result_file = fopen("classic.txt", "a")) == NULL) {
- fprintf(stderr, "nie mozna otworzyc pliku wyniku \n");
- perror("classic");
- return(EXIT_FAILURE);
- }
- //Determine the number of threads to use
- if (USE_MULTIPLE_THREADS) {
- SYSTEM_INFO SysInfo;
- GetSystemInfo(&SysInfo);
- NumThreads = SysInfo.dwNumberOfProcessors;
- if (NumThreads > MAXTHREADS)
- NumThreads = MAXTHREADS;
- }
- else
- NumThreads = 1;
- fprintf(result_file, "Klasyczny algorytm mnozenia macierzy, liczba watkow %d \n", NumThreads);
- printf("liczba watkow = %d\n\n", NumThreads);
- initialize_matricesZ();
- start = (double)clock() / CLK_TCK;
- multiply_matrices_JIK();
- printf("JKI ");
- print_elapsed_time();
- start = (double)clock() / CLK_TCK;
- //multiply_matrices_ijk_ikj(10);
- multiply_matrices_Seq();
- printf("Seq JKI ");
- print_elapsed_time();
- if (result_match()) {
- printf("success!\n");
- }
- fclose(result_file);
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement