Advertisement
codisinmyvines

AntiAbgaryan

Feb 11th, 2021 (edited)
745
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.32 KB | None | 0 0
  1. /*Задача 1*/
  2. #include <omp.h>
  3. #include <stdio.h>
  4. #include <iostream>
  5. int main()
  6. {
  7.     /*
  8.     int count = 0;
  9.     #pragma omp parallel num_threads(8)
  10.     {
  11.         int i = omp_get_thread_num();
  12.         count++;
  13.         printf_s("Hello world from thread %d\n", i);
  14.     }
  15.     printf_s("All threads in parallel area %d", count);
  16.     */
  17.     using std::cout;
  18.     int count = 0;
  19.     #pragma omp parallel num_threads(8)
  20.     {
  21.         int i = omp_get_thread_num();
  22.         count++;
  23.         #pragma omp critical
  24.         {
  25.         cout << "Hello world from thread " << i << "\n";
  26.         }
  27.     }
  28.     cout << "All threads in parallel area " << count;
  29.     return 0;
  30. }
  31. /*Задача 2*/
  32. #include <omp.h>
  33. #include <stdio.h>
  34.  
  35. void parallel_area(int);
  36. int main()
  37. {  
  38.     parallel_area(3);
  39.     parallel_area(1);
  40.  
  41.     return 0;
  42. }
  43. void parallel_area(int threads)
  44. {
  45.     #pragma omp parallel num_threads(threads) if(threads>1)
  46.     {
  47.         if (omp_in_parallel())
  48.         {
  49.             #pragma omp single
  50.             {
  51.                 printf_s("All threads: %d\n", threads);
  52.             }
  53.             printf_s("Num thread: %d\n", omp_get_thread_num());
  54.         }
  55.     }
  56. }
  57. /*Задача 3*/
  58. #include <omp.h>
  59. #include <ctime>
  60. #include <iostream>
  61. void rand_init()
  62. {
  63.     time_t t;
  64.     time(&t);
  65.     srand((unsigned int)t);
  66. }
  67. int main()
  68. {
  69.    
  70.     setlocale(LC_ALL, "RU");
  71.     using std::cout;
  72.     int a, b;
  73.     rand_init();
  74.     a = rand();
  75.     b = rand();
  76.     cout << "До входа в параллельную область #1 a = " << a << " b = " << b << "\n";
  77.     #pragma omp parallel num_threads(2) private(a) firstprivate(b)
  78.     {
  79.         #pragma omp critical
  80.         {
  81.             a = rand();
  82.             cout << "Значения  а и b до сложения с номером потока: " << a << " " << b << "\n";
  83.             b += omp_get_thread_num();
  84.             a += omp_get_thread_num();
  85.             cout << "В 1ой параллельной области а = " << a << " b = " << b << " в потоке " << omp_get_thread_num() << " \n";
  86.         }
  87.     }
  88.     cout << "После выхода из 1ой параллельной области a = " << a << " b = " << b << "\n\n";
  89.     cout << "До входа в параллельную область #2 a = " << a << " b = " << b << "\n";
  90.     #pragma omp parallel num_threads(4) private(b) shared(a)
  91.     {
  92.         #pragma omp critical
  93.         {  
  94.             b = rand();
  95.             cout << "Значения  а и b до вычитания с номером потока: " << a << " " << b << "\n";
  96.             a -= omp_get_thread_num();
  97.             b -= omp_get_thread_num();
  98.             cout << "Во 2ой параллельной области а = " << a << " b = " << b << " в потоке " << omp_get_thread_num() << " \n";
  99.         }
  100.     }
  101.     cout << "После выхода из 2ой параллельной области a = " << a << " b = " << b << "\n";
  102.    
  103.     return 0;
  104. }
  105. /*Задача 4*/
  106. #include <omp.h>
  107. #include <iostream>
  108. int main()
  109. {
  110.     int a[10]{ 2,-1,7,3,4,100,-50,10,4,10 };
  111.     int b[10]{ 10,5,4,3,2,1,7,8,9,6 };
  112.     #pragma omp parallel num_threads(2)
  113.     {
  114.         #pragma omp critical
  115.         {  
  116.             if (omp_get_thread_num() == 0)
  117.             {
  118.                 int min = a[0];
  119.                 for (int i = 0; i < 10; i++)
  120.                     if (a[i] < min)
  121.                         min = a[i];
  122.                 std::cout << "Min element of array A : " << min << "\n";
  123.             }
  124.             else
  125.             {
  126.                 int max = b[0];
  127.                 for (int j = 0; j < 10; j++)
  128.                     if (b[j] > max)
  129.                         max = b[j];
  130.                 std::cout << "Max element of array B : " << max << "\n";
  131.             }
  132.         }
  133.     }
  134.  
  135.     return 0;
  136. }
  137. /*Задача 5*/
  138. #include <omp.h>
  139. #include <iostream>
  140. #include <ctime>
  141. void rand_init()
  142. {
  143.     time_t t;
  144.     time(&t);
  145.     srand((unsigned int)t);
  146. }
  147. int** initarray()
  148. {
  149.     int i, j;
  150.     int** d = new int* [6];
  151.     for (i = 0; i < 6; i++)
  152.         d[i] = new int[8];
  153.     for (i = 0; i < 6; i++)
  154.         for (j = 0; j < 8; j++)
  155.             d[i][j] = rand();
  156.     return d;
  157. }
  158. void deletearray(int** d)
  159. {
  160.     for (int i = 0; i < 6; i++)
  161.         delete[]d[i];
  162.     delete[] d;
  163. }
  164. double srarif(int** d)
  165. {
  166.     int sr = 0;
  167.     for (int i = 0; i < 6; i++)
  168.         for (int j = 0; j < 8; j++)
  169.             sr += d[i][j];
  170.     return sr / 48;
  171. }
  172. int getmin(int** d)
  173. {
  174.     int min = d[0][0];
  175.     for (int i = 0; i < 6; i++)
  176.         for (int j = 0; j < 8; j++)
  177.             if (d[i][j] < min)
  178.                 min = d[i][j];
  179.     return min;
  180. }
  181. int getmax(int** d)
  182. {
  183.     int max = d[0][0];
  184.     for (int i = 0; i < 6; i++)
  185.         for (int j = 0; j < 8; j++)
  186.             if (d[i][j] > max)
  187.                 max = d[i][j];
  188.     return max;
  189. }
  190. int kratno3(int** d)
  191. {
  192.     int k = 0;
  193.     for (int i = 0; i < 6; i++)
  194.         for (int j = 0; j < 8; j++)
  195.             if (d[i][j] % 3 == 0)
  196.                 k++;
  197.     return k;
  198. }
  199. void showarray(int** d)
  200. {
  201.     for (int i = 0; i < 6; i++)
  202.     {
  203.         for (int j = 0; j < 8; j++)
  204.             std::cout << d[i][j] << " ";
  205.         std::cout << "\n";
  206.     }
  207. }
  208. int main()
  209. {
  210.     setlocale(LC_ALL, "RU");
  211.     //rand_init();
  212.     int** d = initarray();
  213.     int n;
  214.     showarray(d);
  215.     std::cout << "\n";
  216.     #pragma omp parallel private(n)
  217.     {
  218.         n = omp_get_thread_num();
  219.         #pragma omp sections
  220.         {  
  221.             #pragma omp section
  222.             {
  223.                 std::cout << "Среднее арифметическое" << srarif(d) << " ,посчитанное потоком " << n << "\n";
  224.             }
  225.             #pragma omp section
  226.             {
  227.                 std::cout << "Минимальный и максимальный элементы соответственно: " << getmin(d) << " " << getmax(d)
  228.                     << " ,найденные потоком " << n << "\n";
  229.             }
  230.             #pragma omp section
  231.             {
  232.                 std::cout << "Количество элементов в массиве кратных 3: " << kratno3(d)
  233.                     << " ,найденное потоком " << n << "\n";
  234.             }
  235.         }
  236.     }
  237.     deletearray(d);
  238.     return 0;
  239. }
  240. /*Задача 6*/
  241. #include <omp.h>
  242. #include <iostream>
  243. int* initarray(int n)
  244. {
  245.     int* s = new int[n];
  246.     for (int i = 0; i < n; i++)
  247.         std::cin >> s[i];
  248.     return s;
  249. }
  250. int main()
  251. {
  252.     setlocale(LC_ALL, "RU");
  253.     int* a = initarray(10);
  254.     int* b = initarray(10);
  255.     double sr1 = 0, sr2 = 0;
  256.     #pragma omp parallel
  257.     {
  258.         #pragma omp for reduction(+: sr1, sr2)
  259.         for (int i = 0; i < 10; i++)
  260.         {
  261.             sr1 += a[i];
  262.             sr2 += b[i];
  263.         }
  264.         #pragma omp single
  265.         {
  266.             sr1 = sr1 / 10;
  267.             sr2 = sr2 / 10;
  268.             if (sr1 == sr2)
  269.                 std::cout << "Среднее арифметическое массива A равно ср. ариф. B\n";
  270.             else
  271.             {
  272.                 if(sr1<sr2)
  273.                     std::cout << "Среднее арифметическое массива A меньше ср. ариф. B\n";
  274.                 else
  275.                     std::cout << "Среднее арифметическое массива A больше ср. ариф. B\n";
  276.             }
  277.         }
  278.     }
  279.     delete[]a;
  280.     delete[]b;
  281.  
  282.     return 0;
  283. }
  284. /*Задача 7*/
  285. #include <omp.h>
  286. #include <iostream>
  287. #include <stdio.h>
  288. int main()
  289. {
  290.     setlocale(LC_ALL, "RU");
  291.     int a[12], b[12], c[12];
  292.     using std::cin;
  293.     using std::cout;
  294.     int n;
  295.     #pragma omp parallel num_threads(3)
  296.     {
  297.         #pragma omp single
  298.         {
  299.             printf_s("Всего нитей в 1ой параллельной области: %d\n", omp_get_num_threads());
  300.         }
  301.         #pragma omp for schedule(static, 4)
  302.         for (int i = 0; i < 12; i++)
  303.         {
  304.             a[i] = i;
  305.             b[i] = i + 1;
  306.             n = omp_get_thread_num();
  307.             //cout << "Итерация под номером " << i << " ,выполяемая нитью номером " << n << "\n";
  308.             printf_s("Итерация под номером %d, выполняемая нитью номером %d, элементы массивов А и В: %d %d\n", i, n, a[i], b[i]);
  309.         }
  310.     }
  311.     cout << "\n";
  312.     #pragma omp parallel num_threads(4)
  313.     {
  314.         #pragma omp single
  315.         {
  316.             printf_s("Всего нитей в 2ой параллельной области: %d\n", omp_get_num_threads());
  317.         }
  318.         #pragma omp for schedule(dynamic, 3)
  319.         for (int i = 0; i < 12; i++)
  320.         {
  321.             c[i] = a[i] + b[i];
  322.             n = omp_get_thread_num();
  323.             printf_s("Итерация под номером %d, выполняемая нитью номером %d, элемент массива С: %d\n", i, n, c[i]);
  324.         }
  325.     }
  326.    
  327.     return 0;
  328. }
  329. /*Задача 8*/
  330. #include <omp.h>
  331. #include <iostream>
  332. #include <ctime>
  333. using std::cin;
  334. using std::cout;
  335. int** init(int n, int m = 1);
  336. void deletee(int**, int n, int m = 1);
  337. int** usualmult(int**, int**, int, int, int);
  338. void show(int**, int n, int m = 1);
  339. int** parallelmult(int**, int**, int, int, int);
  340. int main()
  341. {
  342.     setlocale(LC_ALL, "RU");
  343.     int n1, m1, n2;
  344.     cout << "Введите размерности матрицы: \n";
  345.     cin >> n1 >> m1;
  346.     int** m = init(n1, m1);
  347.     cout << "Введите размерность вектора.\n";
  348.     cout << "Предполгается, что вектор частный случай матрицы, поэтому 2я размерность = 1\n";
  349.     cin >> n2;
  350.     int** v = init(n2);
  351.     if (m1 != n2)
  352.         cout << "Умножение матрицы на вектор невозможно.";
  353.     else
  354.     {
  355.         double seconds, st, end;
  356.         st = omp_get_wtime();
  357.         int** res1 = usualmult(m, v, n1, m1, n2);
  358.         end = omp_get_wtime();
  359.         seconds = end - st;
  360.         cout << "Результат умножения последовательной программы: \n";
  361.         show(res1, n1);
  362.         cout << "Время ее выполнения: " << seconds << " с\n";
  363.         st = omp_get_wtime();
  364.         int** res2 = parallelmult(m, v, n1, m1, n2);
  365.         end = omp_get_wtime();
  366.         seconds = end - st;
  367.         cout << "Результат умножения параллельной программы: \n";
  368.         show(res2, n1);
  369.         cout << "Время ее выполнения: " << seconds << " с\n";
  370.         deletee(res1, n1);
  371.         deletee(res2, n1);
  372.     }
  373.     deletee(m, n1, m1);
  374.     deletee(v, n2);
  375.  
  376.     return 0;
  377. }
  378. int** init(int n, int m)
  379. {
  380.     int** a = new int* [n];
  381.     for (int i = 0; i < n; i++)
  382.         a[i] = new int[m];
  383.     cout << "Введите матрицу(вектор): \n";
  384.     for (int i = 0; i < n; i++)
  385.         for (int j = 0; j < m; j++)
  386.             cin >> a[i][j];
  387.     return a;
  388. }
  389. void deletee(int**a, int n, int m)
  390. {
  391.     for (int i = 0; i < n; i++)
  392.         delete[]a[i];
  393.     delete[]a;
  394. }
  395. int** usualmult(int** m, int** v, int n1, int m1, int n2)
  396. {
  397.     int i, j, k;
  398.     int** res = new int* [n1];
  399.     for (i = 0; i < n1; i++)
  400.         res[i] = new int[1];
  401.     for (j = 0, i = 0; j < n1; j++, i++)
  402.     {  
  403.         res[i][0] = 0;
  404.         for (k = 0; k < m1; k++)
  405.             res[i][0] += m[i][k] * v[k][j - i];
  406.     }
  407.     return res;
  408. }
  409. int** parallelmult(int** m, int** v, int n1, int m1, int n2)
  410. {
  411.     int i, j, k, temp;
  412.     int** res = new int* [n1];
  413.     #pragma omp parallel for
  414.     for (i = 0; i < n1; i++)
  415.         res[i] = new int[1];
  416.     for (j = 0, i = 0; j < n1; j++, i++)
  417.     {
  418.         temp = 0;
  419.         #pragma omp parallel for reduction (+:temp)
  420.         for (k = 0; k < m1; k++)
  421.             temp += m[i][k] * v[k][j - i];
  422.         res[i][0] = temp;
  423.     }
  424.     return res;
  425. }
  426. void show(int** a, int n, int m)
  427. {
  428.     for (int i = 0; i < n; i++)
  429.     {
  430.         for (int j = 0; j < m; j++)
  431.             cout << a[i][j] << " ";
  432.         cout << "\n";
  433.     }
  434. }
  435. /*Задача 9*/
  436. #include <omp.h>
  437. #include <iostream>
  438. #include <ctime>
  439. void rand_init()
  440. {
  441.     time_t t;
  442.     time(&t);
  443.     srand((unsigned int)t);
  444. }
  445. int** initarray()
  446. {
  447.     int i, j;
  448.     int** d = new int* [6];
  449.     for (i = 0; i < 6; i++)
  450.         d[i] = new int[8];
  451.     for (i = 0; i < 6; i++)
  452.         for (j = 0; j < 8; j++)
  453.             d[i][j] = rand();
  454.     return d;
  455. }
  456. void showarray(int** d)
  457. {
  458.     for (int i = 0; i < 6; i++)
  459.     {
  460.         for (int j = 0; j < 8; j++)
  461.             std::cout << d[i][j] << " ";
  462.         std::cout << "\n";
  463.     }
  464. }
  465. void deletearray(int** d)
  466. {
  467.     for (int i = 0; i < 6; i++)
  468.         delete[]d[i];
  469.     delete[] d;
  470. }
  471. int main()
  472. {
  473.     int i, j;
  474.     rand_init();
  475.     int** d = initarray();
  476.     showarray(d);
  477.     int min, max;
  478.     max = min = d[0][0];
  479.     #pragma omp parallel for num_threads(3)
  480.     for (i = 0; i < 6; i++)
  481.     {
  482.         for (j = 0; j < 8; j++)
  483.         {
  484.             if (d[i][j] > max)
  485.             {
  486.                 #pragma omp critical
  487.                 {
  488.  
  489.                     if (d[i][j] > max)
  490.                         max = d[i][j];
  491.                 }
  492.             }
  493.             if (d[i][j] < min)
  494.             {
  495.                 #pragma omp critical
  496.                 {
  497.  
  498.                     if (d[i][j] < min)
  499.                         min = d[i][j];
  500.                 }
  501.             }
  502.         }
  503.     }
  504.     std::cout << "\n";
  505.     std::cout << "Max and min elements of array: " << max << " " << min;
  506.     deletearray(d);
  507.  
  508.     return 0;
  509. }
  510. /*Задача 10*/
  511. #include <omp.h>
  512. #include <ctime>
  513. #include <iostream>
  514. void rand_init()
  515. {
  516.     time_t t;
  517.     time(&t);
  518.     srand((unsigned int)t);
  519. }
  520. inline int* initarray()
  521. {
  522.     int* res = new int[30];
  523.     for (int i = 0; i < 30; i++)
  524.         res[i] = rand();
  525.     return res;
  526. }
  527. inline void showarray(int* a)
  528. {
  529.     for (int i = 0; i < 30; i++)
  530.     {  
  531.         std::cout << a[i] << " ";
  532.         if (i % 10 == 0 && i!=0)
  533.             std::cout << "\n";
  534.     }
  535.     std::cout << "\n";
  536. }
  537. int main()
  538. {  
  539.     rand_init();
  540.     setlocale(LC_ALL, "RU");
  541.     int* a = initarray();
  542.     int i, count = 0;
  543.     showarray(a);
  544.     #pragma omp parallel for num_threads(3)
  545.     for (i = 0; i < 30; i++)
  546.     {
  547.         if (a[i] % 9 == 0)
  548.         {
  549.             #pragma omp atomic
  550.             count++;
  551.         }
  552.     }
  553.     std::cout << "Количество чисел кратных 9 в массиве А: " << count;
  554.     delete[]a;
  555.     return 0;
  556. }
  557. /*Задача 11*/
  558. #include <omp.h>
  559. #include <iostream>
  560. #include <ctime>
  561. void rand_init()
  562. {
  563.     time_t t;
  564.     time(&t);
  565.     srand((unsigned int)t);
  566. }
  567. inline int* initarray(int n)
  568. {
  569.     int* res = new int[n];
  570.     for (int i = 0; i < n; i++)
  571.         res[i] = rand();
  572.     return res;
  573. }
  574. inline void showarray(int* a, int n)
  575. {
  576.     for (int i = 0; i < n; i++)
  577.     {
  578.         std::cout << a[i] << " ";
  579.     }
  580.     std::cout << "\n";
  581. }
  582. int firstmax(int* a, int n)
  583. {
  584.     int i, max = 0;
  585.     for (i = 0; i < n; i++)
  586.     {
  587.         if (a[i] % 7 == 0)
  588.         {
  589.             max = a[i];
  590.             return max;
  591.         }
  592.     }
  593.     return max;
  594. }
  595. int main()
  596. {
  597.     setlocale(LC_ALL, "RU");
  598.     int i, max, n;
  599.     std::cout << "Введите размерность массива: ";
  600.     std::cin >> n;
  601.     rand_init();
  602.     int* a = initarray(n);
  603.     showarray(a, n);
  604.     std::cout << "\n";
  605.     max = firstmax(a, n);
  606.     bool c = true;
  607.     if (max == 0)
  608.     {
  609.         std::cout << "В массиве нет чисел кратных 7!";
  610.         c = false;
  611.     }
  612.     else
  613.     {
  614.         #pragma omp parallel for num_threads(8)
  615.         for (i = 0; i < n; i++)
  616.         {
  617.             if (a[i] > max && a[i] % 7 == 0)
  618.             {
  619.                 #pragma omp critical
  620.                 {
  621.                     if (a[i] > max && a[i] % 7 == 0)
  622.                         max = a[i];
  623.                 }
  624.             }
  625.         }
  626.     }
  627.     if (c)
  628.         std::cout << "Максимальное число кратное 7: " << max;
  629.     delete[]a;
  630.     return 0;
  631. }
  632. /*Задача 12*/
  633. #include <omp.h>
  634. #include <Windows.h>
  635. #include <stdio.h>
  636. int main()
  637. {
  638.     int time;
  639.     #pragma omp parallel num_threads(8) private(time)
  640.     {
  641.         int n = omp_get_thread_num();
  642.         #pragma omp barrier
  643.         {
  644.             switch (n)
  645.             {
  646.             case 0:
  647.                 time = 1000;
  648.                 break;
  649.             case 1:
  650.                 time = 900;
  651.                 break;
  652.             case 2:
  653.                 time = 800;
  654.                 break;
  655.             case 3:
  656.                 time = 700;
  657.                 break;
  658.             case 4:
  659.                 time = 600;
  660.                 break;
  661.             case 5:
  662.                 time = 500;
  663.                 break;
  664.             case 6:
  665.                 time = 200;
  666.                 break;
  667.             case 7:
  668.                 time = 0;
  669.                 break;
  670.             }
  671.         }
  672.         Sleep(time);
  673.         #pragma omp critical
  674.         {
  675.             printf_s("Hello World from thread %d\n", n);
  676.         }
  677.     }
  678.  
  679.     return 0;
  680. }
  681. /*Задача 13*/
  682. #include <omp.h>
  683. #include <cmath>
  684. #include <iostream>
  685. int main()
  686. {
  687.     using std::cin;
  688.     using std::cout;
  689.     setlocale(LC_ALL, "RU");
  690.     int i, n, ch = 0;
  691.     cout << "Введите количество бит: \n";
  692.     cin >> n;
  693.     int* a = new int[n];
  694.     cout << "Введите ваше число в двоичной системе: \n";
  695.     for (i = 0; i < n; i++)
  696.         cin >> a[i];
  697.     #pragma omp parallel for reduction(+:ch)
  698.     for (i = n - 1; i > -1; i--)
  699.     {
  700.         if (a[i] == 1)
  701.             ch += pow(2, n - (i + 1));
  702.     }
  703.     cout << "Десятичное число: " << ch;
  704.  
  705.     return 0;
  706. }
  707. /*Задача 14*/
  708. #include <omp.h>
  709. #include <iostream>
  710.  
  711. int main()
  712. {
  713.     setlocale(LC_ALL, "RU");
  714.     int i, n, k = 0, a = 1;
  715.     std::cout << "Введите число, которое хотите возвести в квадрат: ";
  716.     std::cin >> n;
  717.     #pragma omp parallel for reduction (+:k)
  718.     for (i = 0; i < n; i++)
  719.     {  
  720.         k += a;
  721.         a += 2;
  722.     }
  723.     std::cout << "Квадрат числа " << n << " равен " << k;
  724.  
  725.     return 0;
  726. }
  727. /*Задача 15*/
  728. #include <omp.h>
  729. #include <iostream>
  730. int isprime(int n)
  731. {  
  732.     for (int i = 2; i <= sqrt(n); i++)
  733.     {
  734.         if (n % i == 0)
  735.             return false;
  736.     }
  737.     return true;
  738. }
  739. int main()
  740. {
  741.     setlocale(LC_ALL, "RU");
  742.     int i, ch1, ch2;
  743.     std::cout << "Введите диапазон: \n";
  744.     std::cin >> ch1 >> ch2;
  745.     #pragma omp parallel for num_threads(8)
  746.     for (i = ch1; i <= ch2; i++)
  747.         if (isprime(i))
  748.             std::cout << i << " ";
  749.  
  750.  
  751.     return 0;
  752. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement