Guest User

Jacobi_Alex

a guest
Nov 25th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <stdlib.h>
  4. #include <cstdlib>
  5. #include <fstream>
  6. #include <cmath>
  7. #include <stdio.h>
  8. #include <iomanip>
  9. #include <omp.h>
  10.  
  11. using namespace std;
  12.  
  13. int  sign(double a)
  14. {
  15.     if (a > 0) return 1;
  16.     else return -1;
  17. }
  18.  
  19. void PrintArr(double **arr, int n)
  20. {
  21.     for(int i=0; i<n; i++)
  22.     {
  23.         for(int j=0; j<n; j++)
  24.         if (arr[i][j] < 10) cout<<setw(13)<< arr[i][j]<<"  ";
  25.         else cout<< setw(13)<<arr[i][j]<<" ";
  26.         cout<<endl;
  27.     }
  28. }
  29.  
  30. double **GenArr(int n)
  31. {
  32.     double **arr = new double*[n];
  33.     for (int i=0; i < n; i++)
  34.         arr[i] = new double[n];
  35.  
  36.     for (int i=0; i < n; i++)
  37.         for (int j=i; j < n; j++)
  38.             arr[i][j] = arr[j][i] = rand()%100;
  39.  
  40.     return arr;
  41. }
  42.  
  43. double **CopyArr(double **arr, int n)
  44. {
  45.     double **arr1=new double*[n];
  46.     for (int i=0; i < n; i++)
  47.         arr1[i] = new double[n];
  48.  
  49.     for (int i=0; i < n; i++)
  50.         for (int j=i; j < n; j++)
  51.             arr1[i][j] = arr1[j][i] = arr[i][j];
  52.  
  53.  
  54.     return arr1;
  55. }
  56.  
  57. int sizef(int size)
  58. {
  59.     if (size == 200) return 300;
  60.     else if (size == 300) return 500;
  61.          else return size+500;
  62. }
  63.  
  64. int treadnumf(int treadnum)
  65. {
  66.     if (treadnum == 32) return 48;
  67.     else return treadnum*2;
  68. }
  69.  
  70. int main(int argc, char **argv)
  71. {
  72.     int n=10;
  73.     int iternum=0;
  74.     int treadnum=1;
  75.     double eps=0.001, c=0, s=0, r=0, t=0, tmp3=0, tmp4=0, tmp5=0, norm=0, stTime=0, fnTime=0, time=0;
  76.     double **arr;
  77.     //int k1=0,k2=0,k3=0,k4=0;
  78.     ofstream fout("out.txt");
  79.  
  80.     fout<<endl<<setw(13)<<"size"<<setw(13)<<"treads"<<setw(13)<<"iteration"<<setw(13)<<"time"<<endl;
  81.  
  82.     for (n=200; n <= 2000; n=sizef(n))
  83.     {
  84.         /*Создание массива*/
  85.         arr = GenArr(n);
  86.  
  87.         /*Вывод массива*/
  88.         //PrintArr(arr,n);
  89.  
  90.         for (treadnum=1; treadnum <= 48; treadnum=treadnumf(treadnum))
  91.         {
  92.             double **arr1=CopyArr(arr,n);
  93.             stTime = omp_get_wtime();
  94.             iternum = 0;
  95.  
  96.             /*Подсчёт нормы*/
  97.             norm=0;
  98.             for(int i=0; i < n; i++)
  99.                 for(int j=i + 1; j < n; j++)
  100.                     norm = norm + arr1[i][j] * arr1[i][j];
  101.  
  102.             /*Цикл итераций алгоритма*/
  103.             while (1)
  104.             {
  105.                 /*Проход по элементам зануления*/
  106.                 for(int ik=0; ik < n; ik++)
  107.                 for(int jk=ik + 1; jk < n; jk++)
  108.                 {
  109.                     iternum++;
  110.                     /*Условие выхода*/
  111.                     if (norm <= eps) goto stop;
  112.  
  113.                     /*Вычисление параметров*/
  114.                     if (arr1[ik][ik] == arr1[jk][jk]) c = s = sqrt(2) / 2;
  115.                     else
  116.                     {
  117.                         r = (arr1[jk][jk] - arr1[ik][ik]) / (2 * arr1[ik][jk]);
  118.                         t = sign(r) / (abs(r) + sqrt(1 + r * r));
  119.                         c = 1 / (sqrt(1 + t * t));
  120.                         s = c * t;
  121.                     }
  122.  
  123.                     /*Пересчёт элементов*/
  124.                     tmp3 = arr1[ik][ik];
  125.                     tmp4 = arr1[jk][jk];
  126.                     tmp5 = arr1[ik][jk];
  127.                         omp_set_num_threads(treadnum);
  128.                         #pragma omp parallel for
  129.                         for(int i=0; i < n; i++)
  130.                         {
  131.                             double tmp1 = arr1[ik][i];
  132.                             double tmp2 = arr1[jk][i];
  133.                             arr1[i][ik] = arr1[ik][i] = c * tmp1 - s * tmp2;
  134.                             arr1[i][jk] = arr1[jk][i] = s * tmp1 + c * tmp2;
  135.                             //if (omp_get_thread_num() == 0) k1++;
  136.                             //if (omp_get_thread_num() == 1) k2++;
  137.                             //if (omp_get_thread_num() == 2) k3++;
  138.                             //if (omp_get_thread_num() == 3) k4++;
  139.                         }
  140.                     arr1[ik][ik] = c * c * tmp3 - 2 * c * s * tmp5 + s * s * tmp4;
  141.                     arr1[jk][jk] = s * s * tmp3 + 2 * c * s * tmp5 + c * c * tmp4;
  142.                     arr1[ik][jk] = arr1[jk][ik] = 0;
  143.  
  144.  
  145.                     /*Измеенение нормы*/
  146.                     norm = norm - tmp5 * tmp5;
  147.                 }
  148.             }
  149.  
  150.             stop:
  151.  
  152.             fnTime = omp_get_wtime();
  153.             time = fnTime - stTime;
  154.             fout<<endl<<setw(13)<<n<<setw(13)<<treadnum<<setw(13)<<iternum<<setw(13)<<time<<endl;
  155.             //cout<<"k1="<<k1<<"  k2="<<k2<<"  k3="<<k3<<"  k4="<<k4<<endl;
  156.             //PrintArr(arr,n);
  157.             //PrintArr(arr1,n);
  158.  
  159.             /*Освобождение памяти*/
  160.             for (int i=0; i < n; i++)
  161.                 delete[] arr1[i];
  162.             delete[] arr1;
  163.         }
  164.         for (int i=0; i < n; i++)
  165.             delete[] arr[i];
  166.         delete[] arr;
  167.     }
  168.  
  169.     fout.close();
  170.     system ("pause");
  171.     return 0;
  172. }
Add Comment
Please, Sign In to add comment