Advertisement
patryk

PR - OpenMP

Nov 17th, 2015
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. #include <windows.h>
  6. #include <time.h>
  7. #include <omp.h>
  8.  
  9. using namespace std;
  10. HANDLE hOut;
  11.  
  12. float **matrixA, **matrixB, **matrixC, **correctResult;
  13. int matrixSize, threadsNum, seed;
  14.  
  15. enum algorithm {
  16.     sequential,
  17.     parallel_1,
  18.     parallel_2,
  19.     parallel_3
  20. };
  21.  
  22. enum order {
  23.     KJI,
  24.     IKJ
  25. };
  26.      
  27. void initMatrices(int matrixSize, int seed) {
  28.     srand(seed);
  29.     for (int i = 0; i < matrixSize; i++)
  30.         for (int j = 0; j < matrixSize; j++) {
  31.             matrixA[i][j] = rand() % 100;
  32.             matrixB[i][j] = rand() % 100;
  33.             matrixC[i][j] = 0;
  34.         }
  35. }
  36.  
  37. void printMatrices() {
  38.     for (int i = 0; i < matrixSize; i++) {
  39.         for (int j = 0; j < matrixSize; j++) {
  40.             printf("%f ", matrixA[i][j]);
  41.         }
  42.         printf("\n");
  43.     }printf("\n");
  44.  
  45.     for (int i = 0; i < matrixSize; i++) {
  46.         for (int j = 0; j < matrixSize; j++) {
  47.             printf("%f ", matrixB[i][j]);
  48.         }
  49.         printf("\n");
  50.     }printf("\n");
  51.  
  52.     for (int i = 0; i < matrixSize; i++) {
  53.         for (int j = 0; j < matrixSize; j++) {
  54.             printf("%f ", matrixC[i][j]);
  55.         }
  56.         printf("\n");
  57.     }printf("\n");
  58. }
  59.  
  60. void sequential_algorithm_KJI () {
  61.     for (int k = 0; k < matrixSize; k++) {
  62.         for (int j = 0; j < matrixSize; j++) {
  63.             float tmp = matrixB[k][j];
  64.             for (int i = 0; i < matrixSize; i++)
  65.                 matrixC[i][j] += matrixA[i][k] * tmp;
  66.         }
  67.     }
  68. }
  69.  
  70. void parallel_algorithm1_KJI() {
  71.     #pragma omp parallel num_threads(threadsNum)
  72.     {
  73.         #pragma omp for
  74.         for (int k = 0; k < matrixSize; k++) {
  75.             for (int j = 0; j < matrixSize; j++) {
  76.                 float tmp = matrixB[k][j];
  77.                 for (int i = 0; i < matrixSize; i++)
  78.                     #pragma omp atomic
  79.                     matrixC[i][j] += matrixA[i][k] * tmp;
  80.             }
  81.         }
  82.     }
  83. }
  84.  
  85. void parallel_algorithm2_KJI() {
  86.     #pragma omp parallel num_threads(threadsNum)
  87.     {
  88.         for (int k = 0; k < matrixSize; k++) {
  89.  
  90.             #pragma omp for
  91.             for (int j = 0; j < matrixSize; j++) {
  92.                 float tmp = matrixB[k][j];
  93.                 for (int i = 0; i < matrixSize; i++)
  94.                     matrixC[i][j] += matrixA[i][k] * tmp;
  95.             }
  96.         }
  97.     }
  98. }
  99.  
  100. void parallel_algorithm3_KJI() {
  101.     #pragma omp parallel num_threads(threadsNum)
  102.     {
  103.  
  104.         for (int k = 0; k < matrixSize; k++) {
  105.             for (int j = 0; j < matrixSize; j++) {
  106.                 float tmp = matrixB[k][j];
  107.                
  108.                 #pragma omp for
  109.                 for (int i = 0; i < matrixSize; i++)
  110.                     matrixC[i][j] += matrixA[i][k] * tmp;
  111.             }
  112.         }
  113.     }
  114. }
  115.  
  116. void sequential_algorithm_IKJ() {
  117.     for (int i = 0; i < matrixSize; i++)
  118.         for (int k = 0; k < matrixSize; k++)
  119.             for (int j = 0; j < matrixSize; j++)
  120.                 matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
  121. }
  122.  
  123. void parallel_algorithm1_IKJ() {
  124.     #pragma omp parallel for
  125.     for (int i = 0; i < matrixSize; i++)
  126.         for (int k = 0; k < matrixSize; k++)
  127.             for (int j = 0; j < matrixSize; j++)
  128.                 matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
  129. }
  130.  
  131. void parallel_algorithm2_IKJ() {
  132.     for (int i = 0; i < matrixSize; i++) {
  133.  
  134.         #pragma omp parallel for
  135.         for (int k = 0; k < matrixSize; k++)
  136.             for (int j = 0; j < matrixSize; j++)
  137.  
  138.                 #pragma omp atomic
  139.                 matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
  140.     }
  141. }
  142.  
  143. void parallel_algorithm3_IKJ() {
  144.     for (int i = 0; i < matrixSize; i++)  
  145.         for (int k = 0; k < matrixSize; k++) {
  146.    
  147.             #pragma omp parallel for
  148.             for (int j = 0; j < matrixSize; j++)
  149.                 matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
  150.         }
  151. }
  152.  
  153.  
  154. void checkResult(int matrixSize, float **matrix) {
  155.     for (int i = 0; i < matrixSize; i++)
  156.         for (int j = 0; j < matrixSize; j++)
  157.             if (matrix[i][j] != correctResult[i][j]) {
  158.                 SetConsoleTextAttribute(hOut, 12);
  159.                 printf("\tWrong!\n");
  160.                 SetConsoleTextAttribute(hOut, 7);
  161.                 return;
  162.             }
  163.     SetConsoleTextAttribute(hOut, 10);
  164.     printf("\tCorrect!\n");
  165.     SetConsoleTextAttribute(hOut, 7);
  166. }
  167.  
  168.  
  169. void startTest(algorithm algorytm, order kolejnosc) {
  170.     initMatrices(matrixSize, seed);
  171.    
  172.     double start, stop;
  173.     switch (algorytm) {
  174.         case sequential:
  175.             switch (kolejnosc) {
  176.             case KJI:
  177.                 start = (double)clock() / CLK_TCK;
  178.                 sequential_algorithm_KJI();
  179.                 stop = (double)clock() / CLK_TCK;
  180.                 SetConsoleTextAttribute(hOut, 7);
  181.                 printf("SEKWENCYJNY\t(KJI)\t");
  182.                 break;
  183.             case IKJ:
  184.                 start = (double)clock() / CLK_TCK;
  185.                 sequential_algorithm_IKJ();
  186.                 stop = (double)clock() / CLK_TCK;
  187.                 SetConsoleTextAttribute(hOut, 8);
  188.                 printf("SEKWENCYJNY\t(IKJ)\t");
  189.                 break;
  190.             }
  191.             break;
  192.         case parallel_1:
  193.             switch (kolejnosc) {
  194.             case KJI:
  195.                 start = (double)clock() / CLK_TCK;
  196.                 parallel_algorithm1_KJI();
  197.                 stop = (double)clock() / CLK_TCK;
  198.                 SetConsoleTextAttribute(hOut, 7);
  199.                 printf("ROWNOLEGLY 1\t(KJI)\t");
  200.                 break;
  201.             case IKJ:
  202.                 start = (double)clock() / CLK_TCK;
  203.                 parallel_algorithm1_KJI();
  204.                 stop = (double)clock() / CLK_TCK;
  205.                 SetConsoleTextAttribute(hOut, 8);
  206.                 printf("ROWNOLEGLY 1\t(IKJ)\t");
  207.                 break;
  208.             }
  209.             break;
  210.         case parallel_2:
  211.             switch (kolejnosc) {
  212.             case KJI:
  213.                 start = (double)clock() / CLK_TCK;
  214.                 parallel_algorithm2_KJI();
  215.                 stop = (double)clock() / CLK_TCK;
  216.                 SetConsoleTextAttribute(hOut, 7);
  217.                 printf("ROWNOLEGLY 2\t(KJI)\t");
  218.                 break;
  219.             case IKJ:
  220.                 start = (double)clock() / CLK_TCK;
  221.                 parallel_algorithm2_IKJ();
  222.                 stop = (double)clock() / CLK_TCK;
  223.                 SetConsoleTextAttribute(hOut, 8);
  224.                 printf("ROWNOLEGLY 2\t(IKJ)\t");
  225.                 break;
  226.             }
  227.             break;
  228.         case parallel_3:
  229.             switch (kolejnosc) {
  230.             case KJI:
  231.                 start = (double)clock() / CLK_TCK;
  232.                 parallel_algorithm3_KJI();
  233.                 stop = (double)clock() / CLK_TCK;
  234.                 SetConsoleTextAttribute(hOut, 7);
  235.                 printf("ROWNOLEGLY 3\t(KJI)\t");
  236.                 break;
  237.             case IKJ:
  238.                 start = (double)clock() / CLK_TCK;
  239.                 parallel_algorithm3_IKJ();
  240.                 stop = (double)clock() / CLK_TCK;
  241.                 SetConsoleTextAttribute(hOut, 8);
  242.                 printf("ROWNOLEGLY 3\t(IKJ)\t");
  243.                 break;
  244.             }
  245.             break;
  246.         default:
  247.             printf("Niepoprawna nazwa algorytmu!");
  248.             return;
  249.     }
  250.     printf("%8.4f sec", stop - start);
  251.     SetConsoleTextAttribute(hOut, 7);
  252.     checkResult(matrixSize, matrixC);
  253. }
  254.  
  255.  
  256. void newInstance(int tNum, int mSize, int sd) {
  257.     threadsNum = tNum;
  258.     matrixSize = mSize;
  259.     seed = sd;
  260.  
  261.     matrixA = new float*[matrixSize];
  262.     matrixB = new float*[matrixSize];
  263.     matrixC = new float*[matrixSize];
  264.     correctResult = new float*[matrixSize];
  265.  
  266.     for (int i = 0; i < matrixSize; ++i) {
  267.         matrixA[i] = new float[matrixSize];
  268.         matrixB[i] = new float[matrixSize];
  269.         matrixC[i] = new float[matrixSize];
  270.         correctResult[i] = new float[matrixSize];
  271.     }
  272.    
  273.  
  274.     hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  275.     SetConsoleTextAttribute(hOut, 15);
  276.     printf("\n\n\n\n\nTrwa przygotowanie nowej instancji...\n\n\n");
  277.     SetConsoleTextAttribute(hOut, 7);
  278.     initMatrices(matrixSize, seed);
  279.     sequential_algorithm_KJI();
  280.     for (int i = 0; i < matrixSize; i++)
  281.         for (int j = 0; j < matrixSize; j++)
  282.             correctResult[i][j] = matrixC[i][j];
  283.     printf("[ThreadNum: %d\t  MSize: %d\tSeed: %d]\n\n", threadsNum, matrixSize, seed);
  284. }
  285.  
  286.  
  287. int main(int argc, char* argv[]) {
  288.  
  289.     for (int i = 100; i < 3000; i+=100) {
  290.         newInstance(8, i, 100);
  291.         startTest(sequential, KJI);
  292.         startTest(parallel_1, KJI);
  293.         startTest(parallel_2, KJI);
  294.         startTest(parallel_3, KJI);
  295.  
  296.         startTest(sequential, IKJ);
  297.         startTest(parallel_1, IKJ);
  298.         startTest(parallel_2, IKJ);
  299.         startTest(parallel_3, IKJ);
  300.     }
  301.  
  302.     _getch();
  303.     return 1;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement