Дослідження базових операцій з потоками виконання

Комплексний озгляд основних операцій з потоками виконання. Використання неблокуючої паралелізації для вирішення найпростіших математичних задач, застосовуючи мову програмування C++. Дослідження та оцінювання ефективності паралелізації алгоритму.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык украинский
Дата добавления 06.09.2023
Размер файла 375,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Лабораторна робота

Дослідження базових операцій з потоками виконання

Мета роботи: Розглянути основні операції з потоками виконання, навчитися використовувати неблокуючу паралелізацію для вирішення найпростіших математичних задач, використовуючи мову програмування C++. Навчитися досліджувати та оцінювати ефективність паралелізації алгоритму.

Варіант 1. Створити вектор з N>=10000 елементами з випадкових чисел. Знайти норму

Завдання:

1. Визначити основні характеристики ПК, котрі вливають на ефективність виконання паралельних обчислень. Зафіксувати значення даних характеристик для ПК студента.

Процесор: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz 2.40 GHz;

RAM: 16 ГБ 2667 MHz;

Версія ОС: Windows 11 Pro, версія 22H2

2. Створити механізм, котрий може бути використаний для заміру часу виконання програми, або інших параметрів, котрі студент вважає релевантними.

У C++ існує бібліотека <chrono>, яка дозволяє вимірювати час виконання програми та інші параметри. Для вимірювання часу виконання фрагменту коду використаємо клас std::chrono::high_resolution_clock.

3. Вирішити обрану за варіантом задачу, не використовуючи паралелізацію. Заміряти час вирішення задачі, або інші параметри, котрі студент вважає релевантними.

Лістинг програми наведено у додатку А. Результат роботи виконання програми з використанням 1-го потоку для вектора розмірністю 10000 наведено на рисунку 1.

Рисунок 1. Результат виконання програми з використанням 1-го потоку

4. Вирішити обрану за варіантом задачу, використовуючи паралелізації. Заміряти час вирішення задачі, або інші параметри, котрі студент вважає релевантними. Обґрунтувати вибір алгоритму паралелізації.

Результат виконання програми з використанням 2 потоків для вектора розмірністю 10000 наведено на рисунку 2.

Рисунок 2. Результат виконання програми з використанням 2 потоків

Отже, час виконання програми зменшився.

5. Повторити пункт 4 з використання різної кількості процесів виконання. Обов'язково перевірити виконання задачі на фіксованих кількостях потоків: 2-рази меншій, ніж кількість фізичних ядер, на кількості рівній фізичним ядрам, на кількості рівній логічних ядрам, на кількості більшій в 2, 4, 8, 16 разів ніж кількість логічних ядер.

Кількість потоків: 2

Час виконання 0.0101 сек

Кількість потоків: 4

Час вирішення: 0,0093 сек

Кількість потоків: 8

Час вирішення 0,0054 сек

Кількість потоків: 16

Час вирішення 0,0066 сек

Кількість потоків: 32

Час вирішення 0,0091 сек

Кількість потоків: 64

Час вирішення 0,0129 сек

Кількість потоків: 128

Час вирішення 0,0226 сек

6. Повторити пункт 5 з використанням різної розмірності даних, в залежності від обраної задачі.

Вектор 50000

Кількість потоків: 1

Час виконання 0.0052 сек

Кількість потоків: 2

Час виконання 0.0035 сек

Кількість потоків: 4

Час вирішення: 0,053 сек

Кількість потоків: 8

Час вирішення 0,0052 сек

Кількість потоків: 16

Час вирішення 0,063 сек

Кількість потоків: 32

Час вирішення 0,0093 сек

Кількість потоків: 64

Час вирішення 0,0136 сек

Кількість потоків: 128

Час вирішення 0,0264 сек

Вектор 1000000

Кількість потоків: 1

Час виконання 0.0096 сек

Кількість потоків: 2

Час виконання 0.0088 сек

Кількість потоків: 4

Час вирішення: 0,0069 сек

Кількість потоків: 8

Час вирішення 0,0064 сек

Кількість потоків: 16

Час вирішення 0,0070 сек

Кількість потоків: 32

Час вирішення 0,0087 сек

Кількість потоків: 64

Час вирішення 0,0151 сек

Кількість потоків: 128

Час вирішення 0,0233 сек

7. Заповнити таблицю й зробити графік часу виконання завдання від кількості потоків для різної розмірності.

Розмірність вектора

N = 10000

N = 50000

N = 1000000

1 потік, ms

12,8

5,2

9,6

2 потоки, ms (кількість фізичних ядер / 2)

10,1

3,5

8,8

4 потоки, ms (кількість фізичних ядер 2)

9,3

5,3

6,9

8 потоків, ms (кількість логічних ядер)

5,4

5,2

6,4

16 потоків, ms

6,6

6,3

7

32 потоки, ms

9,1

9,3

8,7

64 потоки, ms

12,9

13,6

15,1

128 потоків, ms

22,6

26,4

23,3

Рисунок 3. Графік часу виконання програми від кількості потоків для різної розмірності вектора

Висновки

У ході виконання лабораторної роботи було розроблено алгоритми паралелізації для роботи з векторами. Проаналізовано залежність часу виконання програми від кількості потоків та розмірності вектору. Емпіричним шляхом встановлено, що ефективність роботи алгоритму паралелізації досягається при кількості потоків рівній кількості логічних ядер. Роботу виконано за допомогою стандартних функцій мови програмування C++.

Додаток А

неблокуючий паралелізація програмування алгоритм

Лістинг програми

#include <thread>

#include <iostream>

#include <chrono>

#include <mutex>

using std::chrono::duration_cast;

using std::chrono::high_resolution_clock;

using std::chrono::nanoseconds;

using namespace std;

static const int threads_num = 1;

static const int n = 10000;

int vector1[n];

int norm_inf = 0;

std::mutex mtx;

void task(int start)

{

int local_max = 0;

for (int i = start; i < n; i += threads_num)

{

local_max = std::max(local_max, abs(vector1[i]));

}

mtx.lock();

norm_inf = std::max(norm_inf, local_max);

mtx.unlock();

}

int main()

{

for (int i = 0; i < n; i++)

{

vector1[i] = rand() % 100;

}

auto task_begin = high_resolution_clock::now();

thread threads[threads_num];

for (int i = 0; i < threads_num; i++)

{

threads[i] = std::thread(task, i);

}

for (int i = 0; i < threads_num; i++)

{

threads[i].join();

}

auto task_end = high_resolution_clock::now();

auto elapsed = duration_cast<nanoseconds>(task_end - task_begin);

std::printf("Processing Time: %.4f seconds.\n", elapsed.count() * 1e-9);

return 0;

}

Размещено на Allbest.ru


Подобные документы

  • Основні визначення дослідження операцій. Модель "затрати-випуск" В.В. Леонтьєва. Загальний вигляд задачі лінійного програмування. Розв'язання за допомогою симплекс-методу. Економічна інтерпретація основної та спряженої задач. Поліпшення плану перевезень.

    учебное пособие [1,1 M], добавлен 27.12.2010

  • Операція алгебраїчного додавання, множення, ділення. Алгоритм ділення модулів чисел. Поняття граф-схеми алгоритму та правила її складання. Основні поняття теорії цифрових автоматів. Синтез керуючого автомата. Контроль виконання арифметичних операцій.

    реферат [55,4 K], добавлен 24.03.2009

  • Вивчення базових засобів об'єктно-орієнтованих мов програмування і отримання навичок постановки і вирішення різних завдань за допомогою ПЕОМ. Дослідження практичних навичок використання науково-технічної та нормативної літератури. Вибір електродвигунів.

    курсовая работа [3,6 M], добавлен 29.03.2023

  • Галузі застосування та принцип роботи мови програмування "Пролог". Керування процесом пошуку рішень, типи даних та використання списків. Рекурсивні процедури та цикли за допомогою пошуку з поверненням. Виконання арифметичних та логічних операцій.

    курс лекций [99,7 K], добавлен 06.07.2011

  • Розробка програмних модулів базових операцій обробки на підставі розрядно-логарифмічного кодування. Дослідження алгоритму розв'язку системи лінійних алгебраїчних рівнянь. Реалізація алгоритму Гауса. Покращення точності розрахунків за допомогою рл-чисел.

    курсовая работа [427,2 K], добавлен 20.11.2013

  • Математичний опис задачі виконання символьних операцій з многочленами, розробка алгоритмів її реалізації і сама реалізація на одній з версій алгоритмічної мови Pascal, контрольна перевірка правильності. Тестування програми на екстремальних вхідних даних.

    контрольная работа [24,1 K], добавлен 20.09.2010

  • Автоматизація виконання операцій на робочих місцях. Розробка програми "Арифметичний калькулятор", що буде дозволяти обраховувати різноманітні арифметичні операцій (додавання, віднімання, ділення, множення). Тестування програми і результати її виконання.

    курсовая работа [226,1 K], добавлен 05.05.2014

  • Класифікація системи за всіма видами класифікаторів. Графічне представлення узагальненої моделі системи. Дослідження операцій в системі. Класифікація основних умов функціонування системи за факторами, що впливають на здійснення визначеної операції.

    курсовая работа [418,8 K], добавлен 01.06.2013

  • Використання графічного методу і симплекс-методу при вирішенні задач лінейного програмування. Сутність двоякого симплекс-методу і М-методу, приклади використання. Аналіз методу динамичного програмування. Специфіка вирішення матричної, антагоністичної гри.

    контрольная работа [1,1 M], добавлен 02.07.2011

  • Визначення основних математичних понять по роботі із 3D-графікою і операцій над векторами і матрицями. Алгоритм видалення невидимих ребер та граней при побудові непрозорих об'єктів за допомогою модуля Graph 3D. Методи програмування анімації і спрайтів.

    курсовая работа [345,0 K], добавлен 16.09.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.