Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Варіанти
Варіант 1. Площа під кривою
1. Початковий рівень. Створити консольну програму, яка обчислює Parallel.For з локальними сумами і виводить обидва значення, похибки відносно Math.PI та час обох способів.
2. Базовий рівень. Створити консольну програму, яка запитує межі інтегрування
3. Високий рівень. Створити консольний застосунок integrate, який приймає опції --function sin|exp|poly, --from, --to, --eps, --rule mid|trap|simpson, --threads 1,2,4,8,16 і --help. Для кожної кількості потоків програма обчислює інтеграл з контролем похибки за правилом Рунге, виводить таблицю «потоки – час –
Варіант 2. Адаптивне інтегрування
1. Початковий рівень. Створити консольну програму, яка обчислює Parallel.Invoke для двох половин відрізка до глибини 8 і виводить обидва значення, похибки, кількість обчислень функції та час.
2. Базовий рівень. Створити консольну програму, яка запитує точність (від
3. Високий рівень. Створити консольний застосунок adaptive, який порівнює для трьох функцій з особливостями (Parallel.For і рекурсивні задачі з порогами глибини 4, 8, 12, 16. Опції: --eps, --threads, --csv <файл>, --help. Програма виводить таблицю «функція – спосіб – час –
Варіант 3. Кратний інтеграл
1. Початковий рівень. Створити консольну програму, яка обчислює подвійний інтеграл Parallel.For за рядками сітки і виводить значення, похибку та час обох способів.
2. Базовий рівень. Створити консольну програму, яка запитує прямокутник
3. Високий рівень. Створити консольний застосунок double-integral, який приймає функцію з переліку (--function gauss|poly|trig), область, кількість вузлів, опцію --layout rows|cols|blocks, --threads 1,2,4,8,16 і --help. Програма подвоює сітку до досягнення точності --eps за правилом Рунге, для кожної кількості потоків виводить час, прискорення, ефективність і записує результати в CSV. Для області поза допустимими межами або непарної кількості вузлів – повідомлення в потік помилок і код завершення 1.
Варіант 4. Об’єм тіла методом Монте-Карло
1. Початковий рівень. Створити консольну програму, яка оцінює об’єм кулі радіуса 1 методом Монте-Карло за 100 000 000 випадкових точок куба Parallel.For, кожен з власним Random із зерном 2026 + k. Програма виводить оцінку, точне значення
2. Базовий рівень. Створити консольну програму, яка запитує кількість точок (від
3. Високий рівень. Створити консольний застосунок montecarlo, який оцінює об’єм тіла, заданого системою нерівностей з переліку (--body ball|torus|intersection), у просторі розмірності від 2 до 10 (--dim), з опціями --points, --blocks, --seed, --threads, --help. Програма виводить оцінку з довірчим інтервалом, таблицю часу й прискорення для різної кількості потоків і перевіряє відтворюваність двох запусків з однаковим зерном. Некоректні опції – потік помилок і код 1.
Варіант 5. Корені многочлена
1. Початковий рівень. Створити консольну програму, яка знаходить усі корені многочлена Чебишова Parallel.For) і уточнює бісекцією паралельно. Програма виводить кількість коренів, перші 5 коренів і найбільшу різницю з точними значеннями
2. Базовий рівень. Створити консольну програму, яка запитує коефіцієнти многочлена (до степеня 20) і відрізок, перевіряє введення, відокремлює корені на сітці із заданою користувачем кількістю відрізків і уточнює їх паралельною бісекцією до
3. Високий рівень. Створити консольний застосунок roots, який читає многочлен з файлу (коефіцієнти через пробіл), приймає опції --from, --to, --segments, --method bisect|psection|newton, --threads і --help. Метод psection обчислює многочлен одночасно в
Варіант 6. Басейни методу Ньютона
1. Початковий рівень. Створити консольну програму, яка для рівняння System.Numerics.Complex, Parallel.For за рядками) і виводить, скільки точок збіглося до кожного з трьох коренів, а скільки – ні, та час послідовної й паралельної версій.
2. Базовий рівень. Створити консольну програму, яка запитує степінь
3. Високий рівень. Створити консольний застосунок newton-basins, який приймає многочлен (--poly "1 0 0 -1"), область, розмір зображення, --schedule static|cyclic|dynamic, --threads і --help. Програма будує басейни притягання, записує зображення PGM, виводить таблицю «розподіл – час –
Варіант 7. Система нелінійних рівнянь
1. Початковий рівень. Створити консольну програму, яка розв’язує систему Parallel.For) і виводить різні знайдені розв’язки (з точністю
2. Базовий рівень. Створити консольну програму, яка запитує розмірність
3. Високий рівень. Створити консольний застосунок newton-system, який розв’язує систему з переліку (--system chain|broyden|trig) розмірності --n методом Ньютона з паралельним якобіаном (--jacobian analytic|numeric) і паралельним розв’язанням лінійної системи методом Гаусса. Опції --tol, --threads, --help. Програма виводить таблицю ітерацій (норма нев’язки, крок, час), підсумкове прискорення й повідомлення в потік помилок з кодом 2, якщо метод не збігся.
Варіант 8. Скалярний добуток і норми
1. Початковий рівень. Створити консольну програму, яка обчислює скалярний добуток двох векторів з 10 000 000 випадкових double блочним розподілом на 1, 2, 4 і 8 потоків (Parallel.For за номерами потоків) і виводить результати та час для кожної кількості потоків.
2. Базовий рівень. Створити консольну програму, яка запитує довжину векторів, кількість потоків і розмір блоку, перевіряє введення та обчислює скалярний добуток, евклідову норму й максимум модулів блочним, циклічним і блочно-циклічним розподілами. Програма виводить таблицю «розподіл – час –
3. Високий рівень. Створити консольний застосунок vecdist, який обчислює скалярний добуток двох випадкових векторів довжини --n блочним, циклічним і блочно-циклічним розподілами для --threads 1,2,4,8,16 і розмірів блоку --blocks 1,64,1024,65536, записує таблицю в CSV і окремо показує відтворюваність: 5 запусків недетермінованої редукції (lock у localFinally) і 5 запусків детермінованої. Для векторів, більших за кеш L3, програма обчислює досягнуту пропускну здатність у ГБ/с. Опція --help; помилки опцій – код 1.
Варіант 9. Множення матриці на вектор
1. Початковий рівень. Створити консольну програму, яка множить матрицю Parallel.For за номерами смуг), перевіряє збіг результатів і виводить час та прискорення.
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриці й кількість потоків, перевіряє введення та множить матрицю на вектор горизонтальними смугами й вертикальними смугами з редукцією часткових векторів. Програма виводить таблицю «схема – час –
3. Високий рівень. Створити консольний застосунок matvec, який множить випадкову матрицю --sizes і кількостей потоків --threads. Програма вимірює пропускну здатність пам’яті окремим тестом, будує прогноз --help; помилки – код 1.
Варіант 10. Шахове множення матриць і алгоритм Фокса
1. Початковий рівень. Створити консольну програму, яка множить дві матриці
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриць Barrier: розсилка блока
3. Високий рівень. Створити консольний застосунок fox, який множить випадкові матриці алгоритмом Фокса (потоки решітки Barrier, розсилка блоків --sizes і решіток --grids 1,2,3,4. Програма рахує обсяг скопійованих даних (аналог обмінів) і час бар’єрів, виводить таблицю «
Варіант 11. Алгоритм Кеннона
1. Початковий рівень. Створити консольну програму, яка для решітки
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриць Barrier. Програма виводить час, прискорення й найбільшу різницю з послідовним множенням.
3. Високий рівень. Створити консольний застосунок cannon, який множить дві випадкові матриці Barrier) з опціями --n, --grid, --kernel scalar|simd, --repeat і --help. Програма вимірює окремо час вирівнювання, множень, копіювань і бар’єрів кожного потоку та виводить таблицю часу за етапами, прогноз прискорення за моделлю й виміряне прискорення. Неправильні розміри – код 1, розбіжність з послідовним множенням понад
Варіант 12. Транспонування великої матриці
1. Початковий рівень. Створити консольну програму, яка транспонує матрицю double Parallel.For за рядками, перевіряє результат і виводить час обох способів.
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриці й перелік розмірів блоку, перевіряє введення та транспонує матрицю блоками паралельно за рядками блоків. Програма виводить таблицю «блок – час – ГБ/с» і позначає найкращий розмір блоку.
3. Високий рівень. Створити консольний застосунок transpose, який порівнює транспонування в нову матрицю й на місці (для квадратної), простий і блочний варіанти, статичний і динамічний розподіл блоків, для розмірів --sizes і потоків --threads. Програма записує таблицю з пропускною здатністю в CSV, перевіряє кожен результат і приймає --help. Непарні або завеликі розміри (понад доступну пам’ять) – повідомлення в потік помилок і код 1.
Варіант 13. Метод спряжених градієнтів
1. Початковий рівень. Створити консольну програму, яка розв’язує тридіагональну систему з 1 000 000 рівнянь (
2. Базовий рівень. Створити консольну програму, яка запитує розмір
3. Високий рівень. Створити консольний застосунок cg, який розв’язує рівняння Пуассона на сітці --size) методом спряжених градієнтів з опціями --tol, --threads, --reduction deterministic|lock і --help. Програма виводить графік збіжності у файл CSV (ітерація, норма нев’язки), таблицю «потоки – ітерацій – час –
Варіант 14. Степеневий метод
1. Початковий рівень. Створити консольну програму, яка знаходить найбільше за модулем власне значення симетричної матриці
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриці й точність, перевіряє введення, генерує випадкову симетричну матрицю та знаходить її найбільше за модулем власне значення степеневим методом з нормуванням вектора до збіжності відношення Релея. Множення матриці на вектор і норма обчислюються паралельно; програма виводить таблицю «ітерація – оцінка – зміна» кожні 10 ітерацій і час.
3. Високий рівень. Створити консольний застосунок power, який читає матрицю з файлу CSV або генерує її (--random <n>), знаходить найбільше власне значення степеневим методом і найменше – методом зворотних ітерацій (з розв’язанням системи методом спряжених градієнтів для симетричних матриць), вимірює час із різною кількістю потоків (--threads) і приймає --help. Несиметрична матриця для зворотних ітерацій – попередження, помилки файлу – код 2.
Варіант 15. Інтерполяція сплайнами
1. Початковий рівень. Створити консольну програму, яка будує кубічний сплайн за 1000 вузлами функції Parallel.For, виводячи найбільшу похибку відносно Math.Sin і час.
2. Базовий рівень. Створити консольну програму, яка запитує кількість вузлів і кількість точок обчислення, перевіряє введення, будує природний кубічний сплайн (прогонка) для функції
3. Високий рівень. Створити консольний застосунок spline, який читає вузли з файлу CSV, приймає точки обчислення з іншого файлу або опції --grid a:b:n, обчислює сплайн паралельно з трьома розподілами точок (блочний, циклічний, відсортовані точки блоками) та порівнює їх час. Опції --threads, --output, --help; невпорядковані чи повторювані вузли – повідомлення в потік помилок і код 2.
Варіант 16. Метод найменших квадратів
1. Початковий рівень. Створити консольну програму, яка генерує 10 000 000 точок
2. Базовий рівень. Створити консольну програму, яка запитує степінь многочлена (від 1 до 8) і кількість точок, перевіряє введення, генерує точки заданого многочлена з шумом і апроксимує їх многочленом методом найменших квадратів: паралельно обчислює матрицю нормальних рівнянь (суми
3. Високий рівень. Створити консольний застосунок lsq, який читає точки з файлу CSV (стовпці x, y), будує апроксимацію многочленом степеня --degree або сумою функцій з опції --basis sin,cos,exp, обчислює нормальні рівняння паралельно, виводить коефіцієнти, похибку, час для різної кількості потоків і записує таблицю залишків у CSV. Опція --help; погано обумовлена система – попередження, помилки файлу – код 2.
Варіант 17. Маятник для багатьох початкових умов
1. Початковий рівень. Створити консольну програму, яка розв’язує рівняння математичного маятника
2. Базовий рівень. Створити консольну програму, яка запитує коефіцієнт опору, крок інтегрування й кількість початкових швидкостей, перевіряє введення та для кожної швидкості інтегрує рівняння маятника з опором до зупинки, рахуючи повні оберти. Програма порівнює блочний і динамічний розподіли задач і виводить час та прискорення.
3. Високий рівень. Створити консольний застосунок pendulum-map, який для маятника з опором (--gamma, --size, --step, --schedule block|cyclic|dynamic, --threads і --help. Програма записує карту в PGM і таблицю часу потоків (min/max/середній) у CSV. Крок, що дає помітну похибку енергії без опору (перевірка за
Варіант 18. Модель «хижак–жертва»
1. Початковий рівень. Створити консольну програму, яка розв’язує систему Лотки–Вольтерри
2. Базовий рівень. Створити консольну програму, яка запитує діапазони параметрів + і -) і час.
3. Високий рівень. Створити консольний застосунок lotka, який паралельно розв’язує модель «хижак–жертва» Лотки–Вольтерри (--a, --b, --c, --d, визначає період і амплітуду коливань кожної траєкторії, записує результати в CSV, порівнює статичний і динамічний розподіли задач та виводить таблицю часу. Опція --help; від’ємні параметри – код 1.
Варіант 19. Рух тіла з опором повітря
1. Початковий рівень. Створити консольну програму, яка для кутів кидка від 1° до 89° з кроком 1° паралельно інтегрує рух тіла з квадратичним опором повітря (Рунге–Кутта 4,
2. Базовий рівень. Створити консольну програму, яка запитує початкову швидкість, коефіцієнт опору й відстань до цілі, перевіряє введення та паралельним перебором 100 000 кутів знаходить кути, за яких тіло влучає в ціль з точністю 0,1 м. Програма виводить знайдені кути, час польоту й час обчислення.
3. Високий рівень. Створити консольний застосунок ballistics, який з опціями --v0, --drag, --target, --wind, --resolution і --help будує таблицю дальності для сітки (кут, швидкість) паралельно, знаходить мінімальну швидкість влучання для кожного кута, записує таблицю в CSV і виводить час послідовної й паралельної версій. Недосяжна ціль – повідомлення в потік помилок і код 2.
Варіант 20. Поширення епідемії SIR
1. Початковий рівень. Створити консольну програму, яка розв’язує модель SIR (
2. Базовий рівень. Створити консольну програму, яка запитує діапазони
3. Високий рівень. Створити консольний застосунок sir, який виконує параметричний розрахунок моделі SEIR на сітці параметрів з опцій, з динамічним балансуванням (лічильник або Parallel.For), записує в CSV пік і тривалість для кожної пари параметрів, виводить час кожного розподілу й найгірші 10 сценаріїв. Опція --help; параметри поза
Варіант 21. Рівняння теплопровідності 1D
1. Початковий рівень. Створити консольну програму, яка розв’язує рівняння теплопровідності Parallel.For за вузлами на кожному кроці і виводить температуру в середині стрижня та час.
2. Базовий рівень. Створити консольну програму, яка запитує кількість вузлів, кроків і потоків, перевіряє умову стійкості Barrier після кожного кроку. Програма виводить час і порівнює результат з послідовною версією.
3. Високий рівень. Створити консольний застосунок heat1d, який розв’язує рівняння теплопровідності з граничними умовами з опцій і порівнює три способи: новий Parallel.For на кожному кроці, окремі потоки з Barrier і окремі потоки, що синхронізуються раз на --help; нестійкий крок – код 1.
Варіант 22. Обчислення π рядами
1. Початковий рівень. Створити консольну програму, яка обчислює Partitioner.Create і локальні суми) і виводить значення, похибку та час.
2. Базовий рівень. Створити консольну програму, яка запитує кількість членів ряду і кількість потоків, перевіряє введення та обчислює
3. Високий рівень. Створити консольний застосунок pi-series, який паралельно обчислює --series) з кількістю членів --terms і досліджує вплив порядку додавання на похибку (--order forward|backward|pairwise, а також підсумовування Кехена) і прискорення для --threads. Програма виводить і записує в CSV таблицю «ряд – порядок – значення – похибка – час – --help; кількість членів понад
Варіант 23. Числа Фібоначчі й DAG
1. Початковий рівень. Створити консольну програму, яка обчислює Parallel.Invoke для двох викликів до глибини 10, рахує кількість викликів (робота) і глибину рекурсії (проміжок) та виводить їх, паралелізм і час.
2. Базовий рівень. Створити консольну програму, яка запитує Parallel.Invoke до порогу, виводить роботу
3. Високий рівень. Створити консольний застосунок dag, який читає граф задач з файлу (рядок – «ім’я тривалість залежності»), обчислює роботу, проміжок і критичний шлях, моделює жадібний планувальник для --procs 1,2,4,8) і виводить діаграму Ганта текстом, а також виконує граф справжніми задачами TPL із Task.Delay. Цикли в графі – повідомлення в потік помилок і код 2.
Варіант 24. Редукційне дерево і PRAM
1. Початковий рівень. Створити консольну програму, яка моделює EREW PRAM для суми 16 чисел: на кожному кроці виводить, які процесори які комірки читають і записують, і перевіряє, що жодна комірка не читається двома процесорами одночасно.
2. Базовий рівень. Створити консольну програму, яка запитує кількість чисел Parallel.For на кожному кроці) пошук суми й максимуму деревом за
3. Високий рівень. Створити консольний застосунок pram, який моделює програми для EREW, CREW і CRCW PRAM (сума, максимум за --model, --n, --trace і --help. Програма рахує кроки й операції, виявляє порушення правил доступу моделі та виводить їх у потік помилок; для порушень – код завершення 3.
Варіант 25. Суперкроки BSP
1. Початковий рівень. Створити консольну програму, яка на 4 окремих потоках з Barrier виконує 5 суперкроків BSP: кожен потік додає до свого значення отримане від лівого сусіда та надсилає результат правому; програма виводить стан після кожного суперкроку.
2. Базовий рівень. Створити консольну програму, яка запитує кількість процесорів Barrier. Програма виводить для кожного суперкроку
3. Високий рівень. Створити консольний застосунок bsp, який надає класи «процесор» і «повідомлення» для BSP-програм на потоках (Send, Sync, отримані повідомлення), рахує --p, --n, --g, --l, --help; програма порівнює прогноз
Варіант 26. Балансування навантаження
1. Початковий рівень. Створити консольну програму, яка перевіряє простоту чисел від 1 до 20 000 000 перебором дільників блочним розподілом на 8 потоків і динамічним лічильником Interlocked.Increment з порціями по 1000 чисел, виводячи кількість простих і час обох способів.
2. Базовий рівень. Створити консольну програму, яка запитує кількість задач і закон розподілу їх тривалості (рівномірна, зростаюча, випадкова), перевіряє введення та виконує задачі-обчислення блочним, циклічним і динамічним розподілами. Програма виводить таблицю «розподіл – час –
3. Високий рівень. Створити консольний застосунок balance, який порівнює блочний, циклічний розподіли, лічильник з порціями --chunk, «майстер–робітник» з каналом (System.Threading.Channels) і Parallel.For для задач з файлу (тривалість або параметр кожної задачі), записує час кожного потоку в CSV і виводить підсумкову таблицю. Опція --help; порожній файл – код 2.
Варіант 27. Грід-планувальник (імітація)
1. Початковий рівень. Створити консольну програму, яка моделює 3 організації (кластери з 16, 32 і 8 ядрами) і 200 завдань з випадковою кількістю ядер і тривалістю, розподіляє завдання жадібно на ресурс з найменшим очікуванням і виводить час завершення всіх завдань.
2. Базовий рівень. Створити консольну програму, яка читає опис ресурсів трьох організацій і список завдань з вимогами (ядра, пам’ять, віртуальна організація), перевіряє дані та моделює брокер гріду: завдання потрапляє лише на ресурси своєї ВО. Програма виводить розклад, завантаження кожного ресурсу й середній час очікування.
3. Високий рівень. Створити консольний застосунок gridsim, який моделює грід із ресурсами, віртуальними організаціями та політиками доступу з файлу JSON, порівнює стратегії брокера (--policy random|least-queue|best-fit) і виконує моделювання паралельно для кількох зерен генератора. Програма виводить таблицю «стратегія – середнє очікування – завантаження» і приймає --help; некоректний JSON – код 2.
Варіант 28. Добровільні обчислення (імітація)
1. Початковий рівень. Створити консольну програму, яка моделює сервер з 1000 робочими одиницями (перевірка простоти чисел з діапазону) і 8 клієнтів-потоків, що беруть одиниці з черги ConcurrentQueue, обчислюють і повертають результати; програма виводить кількість простих і внесок кожного клієнта.
2. Базовий рівень. Створити консольну програму, яка запитує кількість клієнтів, імовірність помилкового результату та кворум (2 або 3), перевіряє введення і моделює сервер добровільних обчислень: кожна робоча одиниця видається кільком клієнтам, результат приймається, коли збігається кворум відповідей. Програма виводить кількість повторних видач і виявлених помилок.
3. Високий рівень. Створити консольний застосунок volunteer, який моделює сервер і клієнтів із відмовами (зникнення, повільність, хибні результати), дедлайнами й повторною видачею робочих одиниць, з опціями --clients, --units, --failure, --quorum, --deadline і --help. Програма виводить час завершення, частку зайвих обчислень і журнал подій у файл. Некоректні ймовірності – код 1.
Варіант 29. Прогноз прискорення
1. Початковий рівень. Створити консольну програму, яка множить матриці
2. Базовий рівень. Створити консольну програму, яка запитує розмір матриць і перелік кількостей потоків, перевіряє введення, вимірює параметри моделі (час однієї операції множення-додавання, час порожнього Parallel.For) і для множення матриць смугами виводить таблицю прогнозованого й виміряного прискорення та ефективності.
3. Високий рівень. Створити консольний застосунок predict, який для множення матриць (смуги, шахова схема, Кеннон) вимірює параметри моделі (операція, копіювання блоку, бар’єр, пропускна здатність пам’яті), будує прогноз для розмірів --sizes і потоків --threads, порівнює його з вимірюванням, обчислює метрику Карпа–Флатта й записує таблицю в CSV. Опція --help; розбіжність прогнозу понад 50 % позначається попередженням.
Варіант 30. Ізоефективність
1. Початковий рівень. Створити консольну програму, яка обчислює суму масиву з
2. Базовий рівень. Створити консольну програму, яка запитує цільову ефективність (від 0,3 до 0,9), перевіряє введення і для
3. Високий рівень. Створити консольний застосунок isoefficiency, який експериментально визначає функцію ізоефективності для трьох алгоритмів (сума, множення матриці на вектор смугами, множення матриць) бінарним пошуком розміру задачі, записує точки --target, --threads, --help.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань.
- Для свого варіанта виконати аналіз за методологією PCAM: визначити примітивні задачі, обміни між ними, спосіб укрупнення та розподіл між потоками (статичний чи динамічний); оцінити роботу й проміжок алгоритму.
- Створити в JetBrains Rider консольний проєкт .NET 10; реалізувати послідовну версію, паралельну версію та перевірку результату з еталоном (для дійсних чисел – з допуском, для чисельних методів – з точним розв’язком або оцінкою похибки за правилом Рунге).
- Скласти модель часу виконання, виміряти її параметри (час однієї операції, синхронізації, пропускну здатність пам’яті) і обчислити прогноз прискорення.
- Виміряти час у конфігурації Release (прогрівання, медіана щонайменше 5 запусків) для 1, 2, 4, 8 і 16 потоків, записати таблицю в CSV і побудувати графік прогнозованого й виміряного прискорення в Excel або LibreOffice Calc; пояснити розбіжності.
- Продемонструвати роботу програми, пояснити код, модель і результати вимірювань, відповісти на контрольні питання.