You are on page 1of 8

Міністерство освіти і науки України

Економіко-правничий коледж

Звіт з лабораторної роботи № 11

Тема: Основи інженерії паралельних алгоритмів

Виконав: Наврось Олександр


студент гр. к121-19
Перевірила: Чопорова О.В.

Запоріжжя 2023
Мета роботи: вивчення базових особливостей проєктування та
програмування програмних засобів на базі паралельних обчислень

Математична модель:

( )
n
(− 1 )n x 2 n+1

n=0 ( 2 n+1 ) !

Де n – кількість членів, х – задане число


Лістинг програми:
using System;
using System.Threading;

class Program
{
static double sin_x = 0;
static int num_threads = 4;
static int num_iterations;
static double accuracy;

static void Main(string[] args)


{

Console.WriteLine("Enter number - 1 if calculate sin with interations, 2 if calculate sin with accuracy: ");
int res = int.Parse(Console.ReadLine());

if (res == 1)
{
Console.WriteLine("Enter the number of iterations: ");
num_iterations = int.Parse(Console.ReadLine());

Console.WriteLine("Enter x: ");
int x = int.Parse(Console.ReadLine());

// Calculate sin x with a given number of iterations


Thread[] threads1 = new Thread[num_threads];
for (int i = 0; i < num_threads; i++)
{
threads1[i] = new Thread(new ParameterizedThreadStart(CalculateOddEven));
threads1[i].Start(i);
}
for (int i = 0; i < num_threads; i++)
{
threads1[i].Join();
}
Console.WriteLine("With {0} iterations, sin x = {1}", num_iterations, sin_x);

}
else
{
Console.WriteLine("Enter the accuracy: ");
accuracy = double.Parse(Console.ReadLine());

// Calculate sin x with a given accuracy


sin_x = 0;
num_iterations = 1;
Thread[] threads2 = new Thread[2];
threads2[0] = new Thread(new ThreadStart(CalculateOdd));
threads2[1] = new Thread(new ThreadStart(CalculateEven));
threads2[0].Start();
threads2[1].Start();
for (int i = 0; i < 2; i++)
{
threads2[i].Join();
}
Console.WriteLine("With {0} accuracy, sin x = {1}", accuracy, sin_x);
}

}
static void CalculateOddEven(object index)
{
int i = (int)index;
double x = GetUserInput();
for (int j = i + 1; j <= num_iterations; j += num_threads)
{
sin_x += Math.Pow(-1, j) * Math.Pow(x, 2*j+1) / Program.Factorial(2*j+1 );
}
}

static void CalculateOdd()


{
double term = Program.GetUserInput();
double last_term = 0;
while (Math.Abs(term - last_term) > accuracy)
{
sin_x += term;
num_iterations += 2;
last_term = term;
term *= -(Program.GetUserInput() * Program.GetUserInput()) / ((num_iterations - 1) * num_iterations);
}
}

static void CalculateEven()


{
double term = 1;
double last_term = 0;
while (Math.Abs(term - last_term) > accuracy)
{
sin_x += term;
num_iterations += 2;
last_term = term;
term *= -(Program.GetUserInput() * Program.GetUserInput()) / ((num_iterations - 1) * num_iterations);
}
}

static double GetUserInput()


{
Console.WriteLine("Enter x: ");
return double.Parse(Console.ReadLine());
}

static double Factorial(int n)


{
double result = 1;
for (int i = 2; i <= n; i++)
{
result *= i;
}
return result;
}
}
Приклад роботи програми:
Розрахунок зі значенням 90
Відповіді на контрольні питання:

1. Паралельні обчислення - це техніка програмування, в якій завдання


розбивається на менші підзадачі, які можуть виконуватися у багатозадачному
режимі (режиму розподілу часу), паралельно на декількох процесорах або
ядрах або розподілено, використовуючи мережу керованих комп’ютерів. Ця
техніка використовується для прискорення виконання обчислювально
інтенсивних завдань, шляхом розподілу роботи між декількома процесорами
або ядрами, тим самим скорочуючи загальний час обробки.

При паралельній обробці кожному процесору або ядру призначається


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

2. Приклади застосування таких обчислень:


Наукові обчислення: Багато наукових застосувань, таких як симуляції та
моделювання, передбачають складні обчислення, які можуть виграти від
паралельної обробки.

Обробка зображень: Багато алгоритмів обробки зображень, таких як


фільтрація та сегментація зображень, передбачають обробку великих обсягів
даних, яку можна прискорити за допомогою паралельних методів обробки.

Машинне навчання: Багато алгоритмів машинного навчання передбачають


навчання моделей на великих наборах даних, що може зайняти багато часу.
Паралельна обробка може бути використана для прискорення процесу
навчання.

Обробка відео та аудіо: Багато завдань з обробки відео та аудіо, таких як


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

3. Точка синхронізації - це певна точка в програмі або системі, де різні


потоки, процеси або системи синхронізують свої дії, щоб гарантувати, що
вони працюють разом правильно і дають бажаний результат. Точка
синхронізації - це зазвичай точка в коді, де один потік або процес чекає, поки
інший потік або процес завершить завдання або досягне певної точки, перш
ніж продовжити власне виконання.
4. Багатозадачність - це режим роботи комп'ютера, який дозволяє декільком
завданням або процесам працювати одночасно в одній комп'ютерній системі.
У багатозадачному режимі операційна система розподіляє процесорний час
для кожного завдання або процесу, дозволяючи їм працювати одночасно, і
користувачеві здається, що вони виконуються паралельно.
5. Паралельне виконання та розподілене виконання - це два різні підходи до
виконання завдань, які потребують великої обчислювальної потужності.
Паралельне виконання - це одночасне виконання декількох частин одного
завдання на декількох процесорах або ядрах. При паралельному виконанні
завдання розбивається на менші підзадачі, і кожна підзадача виконується
одночасно на різних процесорах або ядрах. Процесори або ядра зазвичай
розташовані в одній комп'ютерній системі, і вони взаємодіють один з одним
для обміну даними та синхронізації своїх дій. Паралельне виконання часто
використовується для прискорення виконання обчислювально інтенсивних
завдань, таких як наукове моделювання або обробка даних.
З іншого боку, розподілене виконання - це виконання одного завдання на
декількох комп'ютерних системах або вузлах, з'єднаних мережею. При
розподіленому виконанні завдання розбивається на менші підзадачі, і кожна
підзадача виконується на іншій комп'ютерній системі або вузлі. Різні системи
або вузли спілкуються один з одним через мережу для обміну даними та
синхронізації своїх дій. Розподілене виконання часто використовується для
обробки завдань, які вимагають великої обчислювальної потужності і не
можуть бути виконані на одній комп'ютерній системі.
6. Процес - це екземпляр програми, який виконується комп'ютерною
системою. Процес має власний простір пам'яті, системні ресурси та
середовище виконання. Кожен процес ідентифікується унікальним
ідентифікатором процесу, який використовується операційною системою для
управління процесом і виділення йому ресурсів.
Потік - це окрема виділена частина процесу, яка поділяє той самий простір
пам'яті, що й інші потоки в межах того самого процесу. Потоки - це
незалежні послідовності інструкцій, які можуть виконуватися одночасно з
іншими потоками в межах одного процесу. Кожен потік має власний
контекст виконання, включаючи власний стек, набір регістрів та програмний
лічильник.

You might also like