Facebook
From Unreliable Hog, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 265
  1. // classic.cpp : "Textbook" implementation of matrix multiply
  2.  
  3. // Author:  Paul J. Drongowski
  4. // Address: Boston Design Center
  5. //          Advanced Micro Devices, Inc.
  6. //          Boxborough, MA 01719
  7. // Date:    20 October 2005
  8. //
  9. // Copyright (c) 2005 Advanced Micro Devices, Inc.
  10.  
  11. // Celem tego programu jest prezentacja pomiaru i analizy
  12. //efektywnosci programu za pomocą  CodeAnalyst(tm).
  13. // Implementacja mnożenia macierzy jest realizowana za pomoca typowego
  14. // algorytmu podręcznikowego.
  15. //  Efektywność tego podejscia jest niska poprzez
  16. // nieefektywną  kolejnosć odwołań do elementów macierzy.
  17. #include <stdio.h>
  18. #include <time.h>
  19. #include <windows.h>
  20. #include "omp.h"
  21.  
  22. #define USE_MULTIPLE_THREADS true
  23. #define MAXTHREADS 128
  24. int NumThreads;
  25. double start;
  26.  
  27. static const int ROWS = 10000;     // liczba wierszy macierzy
  28. static const int COLUMNS = 10000;  // lizba kolumn macierzy
  29.  
  30. float matrix_a[ROWS][COLUMNS];    // lewy operand
  31. float matrix_b[ROWS][COLUMNS];    // prawy operand
  32. float matrix_r[ROWS][COLUMNS];    // wynik
  33.  
  34. FILE *result_file;
  35.  
  36. void initialize_matrices()
  37. {
  38.         // zdefiniowanie zawarosci poczatkowej macierzy
  39. #pragma omp parallel for
  40.         for (int i = 0; i < ROWS; i++) {
  41.                 for (int j = 0; j < COLUMNS; j++) {
  42.                         matrix_a[i][j] = (float)rand() / RAND_MAX;
  43.                         matrix_b[i][j] = (float)rand() / RAND_MAX;
  44.                         matrix_r[i][j] = 0.0;
  45.                 }
  46.         }
  47. }
  48.  
  49. void initialize_matricesZ()
  50. {
  51.         // zdefiniowanie zawarosci poczatkowej macierzy
  52. #pragma omp parallel for
  53.         for (int i = 0; i < ROWS; i++) {
  54.                 for (int j = 0; j < COLUMNS; j++) {
  55.                         matrix_r[i][j] = 0.0;
  56.                 }
  57.         }
  58. }
  59. void print_result()
  60. {
  61.         // wydruk wyniku
  62.         for (int i = 0; i < ROWS; i++) {
  63.                 for (int j = 0; j < COLUMNS; j++) {
  64.                         fprintf(result_file, "%6.4f ", matrix_r[i][j]);
  65.                 }
  66.                 fprintf(result_file, "\n");
  67.         }
  68. }
  69.  
  70. void multiply_matrices_IKJ()
  71. {
  72.         // mnozenie macierzy
  73. #pragma omp parallel for
  74.         for (int i = 0; i < ROWS; i++)
  75.                 for (int k = 0; k < COLUMNS; k++)
  76.                         for (int j = 0; j < COLUMNS; j++)
  77.                                 matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
  78.  
  79. }
  80.  
  81. void print_elapsed_time()
  82. {
  83.         double elapsed;
  84.         double resolution;
  85.  
  86.         // wyznaczenie i zapisanie czasu przetwarzania
  87.         elapsed = (double)clock() / CLK_TCK;
  88.         resolution = 1.0 / CLK_TCK;
  89.  
  90.         fprintf(result_file,
  91.                 "Czas wykonania programu: %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  92.                 elapsed - start, resolution);
  93. }
  94.  
  95. int main(int argc, char* argv[])
  96. {
  97.         //       start = (double) clock() / CLK_TCK ;
  98.         if ((result_file = fopen("classic.txt", "w")) == NULL) {
  99.                 fprintf(stderr, "nie mozna otworzyc pliku wyniku \n");
  100.                 perror("classic");
  101.                 return(EXIT_FAILURE);
  102.         }
  103.  
  104.  
  105.         //Determine the number of threads to use
  106.         if (USE_MULTIPLE_THREADS) {
  107.                 SYSTEM_INFO SysInfo;
  108.                 GetSystemInfo(&SysInfo);
  109.                 NumThreads = SysInfo.dwNumberOfProcessors;
  110.                 if (NumThreads > MAXTHREADS)
  111.                         NumThreads = MAXTHREADS;
  112.         }
  113.         else
  114.                 NumThreads = 1;
  115.         fprintf(result_file, "Klasyczny algorytm mnozenia macierzy, liczba watkow %d \n", NumThreads);
  116.         printf("liczba watkow  = %d\n\n", NumThreads);
  117.  
  118.         initialize_matrices();
  119.         start = (double)clock() / CLK_TCK;
  120.         multiply_matrices_IKJ();
  121.         print_elapsed_time();
  122.        
  123.  
  124.         fclose(result_file);
  125.  
  126.         return(0);
  127. }