Facebook
From Tacky Wolf, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 259
  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 = 1000;     // liczba wierszy macierzy
  28. static const int COLUMNS = 1000;  // 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.         for (int i = 0; i < ROWS; i++)
  73.                 for (int k = 0; k < COLUMNS; k++)
  74.                         for (int j = 0; j < COLUMNS; j++)
  75.                                 matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
  76.  
  77. }
  78.  
  79.  
  80. void multiply_matrices_IKJ_ATOMIC()
  81. {
  82. #pragma omp parallel for
  83.         for (int i = 0; i < ROWS; i++)
  84.                 for (int k = 0; k < COLUMNS; k++)
  85.                         for (int j = 0; j < COLUMNS; j++)
  86.                                 matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
  87.  
  88.  
  89.        
  90. }
  91.  
  92. void multiply_matrices_IKJ_REDUCTION()
  93. {
  94.  
  95.         for (int i = 0; i < ROWS; i++)
  96.                 for (int k = 0; k < COLUMNS; k++)
  97.                         for (int j = 0; j < COLUMNS; j++)
  98.                                 matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
  99.  
  100.  
  101.  
  102. }
  103.  
  104. void print_elapsed_time()
  105. {
  106.         double elapsed;
  107.         double resolution;
  108.  
  109.         // wyznaczenie i zapisanie czasu przetwarzania
  110.         elapsed = (double)clock() / CLK_TCK;
  111.         resolution = 1.0 / CLK_TCK;
  112.  
  113.         fprintf(result_file,
  114.                 "Czas wykonania programu: %8.4f sec (%6.4f sec rozdzielczosc pomiaru)n",
  115.                 elapsed - start, resolution);
  116. }
  117.  
  118. int main(int argc, char* argv[])
  119. {
  120.         //       start = (double) clock() / CLK_TCK ;
  121.         if ((result_file = fopen("classic.txt", "w")) == NULL) {
  122.                 fprintf(stderr, "nie mozna otworzyc pliku wyniku n");
  123.                 perror("classic");
  124.                 return(EXIT_FAILURE);
  125.         }
  126.  
  127.  
  128.         //Determine the number of threads to use
  129.         if (USE_MULTIPLE_THREADS) {
  130.                 SYSTEM_INFO SysInfo;
  131.                 GetSystemInfo(&SysInfo);
  132.                 NumThreads = SysInfo.dwNumberOfProcessors;
  133.                 if (NumThreads > MAXTHREADS)
  134.                         NumThreads = MAXTHREADS;
  135.         }
  136.         else
  137.                 NumThreads = 1;
  138.         fprintf(result_file, "Klasyczny algorytm mnozenia macierzy, liczba watkow %d n", NumThreads);
  139.         printf("liczba watkow  = %dnn", NumThreads);
  140.  
  141.  
  142.         initialize_matricesZ();
  143.         start = (double)clock() / CLK_TCK;
  144.         multiply_matrices_IKJ();
  145.         print_elapsed_time();
  146.  
  147.  
  148.         initialize_matricesZ();
  149.         start = (double)clock() / CLK_TCK;
  150.         //multiply_matrices_JIK();
  151.         print_elapsed_time();
  152.  
  153.  
  154.         initialize_matricesZ();
  155.         start = (double)clock() / CLK_TCK;
  156.         //multiply_matrices_JKI();
  157.         print_elapsed_time();
  158.  
  159.         fclose(result_file);
  160.  
  161.         return(0);
  162. }