Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Варіанти
Варіант 1. Рендеринг анімації
1. Початковий рівень. Створити консольну програму, яка для рендерера анімації з часами етапів, заданими в програмі (завантаження сцени 12 с, рендеринг кадрів 540 с, збирання відео 18 с), обчислює частку паралельного коду
2. Базовий рівень. Створити консольну програму, яка запитує в користувача назви й тривалості етапів рендерера (до порожнього рядка) та позначку, чи паралелізується етап. Програма повторює запит при некоректних значеннях, виводить таблицю етапів із частками часу, частку
3. Високий рівень. Створити консольний застосунок, який читає профіль рендерера з CSV-файлу, заданого аргументом (stage;seconds;parallel), і приймає опції --cores 1,2,4,8, --deadline <секунди> та --help. Програма виводить таблицю етапів, таблицю прогнозу для кожної кількості ядер із позначкою конфігурацій, що вкладаються в дедлайн, та мінімальну достатню кількість ядер. Помилки формату файлу (номер рядка) виводяться в потік помилок; коди завершення: 0 – успіх, 1 – помилка аргументів, 2 – помилка файлу, 3 – дедлайн недосяжний.
Варіант 2. Кодування відео
1. Початковий рівень. Створити консольну програму, яка за часами кодування відеофайлу, заданими в програмі для 1, 2, 4 і 8 потоків (620, 330, 185, 118 с), обчислює та виводить прискорення, ефективність і метрику Карпа–Флатта для кожної кількості потоків.
2. Базовий рівень. Створити консольну програму, яка читає з клавіатури пари «кількість потоків – час, с» до порожнього рядка, перевіряє, що кількості потоків додатні й не повторюються, а час додатний, і що є вимірювання для одного потоку. Програма виводить вирівняну таблицю
3. Високий рівень. Створити консольний застосунок, який читає CSV-файл вимірювань кодування (video;threads;seconds, кілька відео, кілька запусків на конфігурацію) з аргументу командного рядка. Для кожного відео програма бере медіану запусків, виводить таблицю --out <файл> записує зведену таблицю в CSV. Опція --help виводить довідку; некоректні рядки пропускаються з повідомленням у потік помилок; коди завершення: 0, 1 – аргументи, 2 – файл.
Варіант 3. Прогноз погоди
1. Початковий рівень. Створити консольну програму, яка для сіткової моделі погоди з послідовною часткою
2. Базовий рівень. Створити консольну програму, яка запитує послідовну частку моделі (у відсотках від 0 до 100) і максимальну кількість процесорів (степінь двійки до 4096), перевіряє введення та виводить таблицю прискорення й ефективності за обома законами. Програма визначає, починаючи з якої кількості процесорів ефективність за законом Амдала стає меншою за 50 %.
3. Високий рівень. Створити консольний застосунок для порівняння законів Амдала й Густафсона, який приймає аргументи --serial <частка>, --cores <список> або --max <p>, --grid <розмір сітки на 1 процесор> і --help. Програма виводить таблицю: --csv <файл>. Помилки аргументів виводяться в потік помилок з кодом завершення 1; без аргументів параметри вводяться з клавіатури.
Варіант 4. Нічний банківський звіт
1. Початковий рівень. Створити консольну програму, яка за заданими в програмі часами етапів нічної обробки транзакцій (вивантаження з бази 25 хв, перевірка й розрахунок 210 хв, формування звіту 15 хв) обчислює частку паралельного коду та прогнозований час обробки на 4, 8 і 16 ядрах за законом Амдала.
2. Базовий рівень. Створити консольну програму, яка запитує тривалості трьох етапів обробки транзакцій у хвилинах і допустиме вікно обробки (наприклад, з 01:00 до 05:00), перевіряє введення й виводить таблицю прогнозованого часу для HH:mm.
3. Високий рівень. Створити консольний застосунок, який читає з файлу журнал етапів обробки за кілька ночей (date;stage;minutes;parallel), для кожної ночі визначає частку --window 01:00-05:00 програма обирає мінімальну кількість ядер, достатню для найгіршої ночі, а за опцією --growth <відсотки> прогнозує її через рік зростання кількості транзакцій. Помилки – у потік помилок, коди завершення 0/1/2, опція --help.
Варіант 5. Прості числа
1. Початковий рівень. Створити консольну програму, яка перебором дільників до Stopwatch.
2. Базовий рівень. Створити консольну програму, яка запитує верхні межі діапазонів (цілі числа від 1000 до
3. Високий рівень. Створити консольний застосунок, який порівнює два алгоритми підрахунку простих чисел (перебір дільників і решето Ератосфена) для меж, заданих аргументом --limits 1e5,1e6,1e7, з кількістю запусків --runs <n>. Програма виводить таблицю медіан, мінімумів і відносного відхилення, перевіряє збіг кількостей простих чисел, оцінює показник степеня складності за двома найбільшими межами й записує результати в CSV (--csv). Опція --help, помилки в потік помилок, код 3 – якщо результати алгоритмів не збіглися.
Варіант 6. Фотоархів
1. Початковий рівень. Створити консольну програму, яка для обробки фотоархіву з частками часу, заданими в програмі (послідовно – 8 %, паралельно – 92 %, загальний час на одному ядрі 50 хв), виводить час обробки та ефективність для 1–32 ядер і найбільшу кількість ядер, за якої ефективність не менша за 70 %.
2. Базовий рівень. Створити консольну програму, яка запитує час обробки фотоархіву на одному ядрі, частку паралельного коду, бюджет часу у хвилинах і мінімальну допустиму ефективність у відсотках. Після перевірки введення програма виводить таблицю для 1–64 ядер і рекомендовану кількість ядер: найменшу, що вкладається в бюджет, за умови дотримання мінімальної ефективності, або повідомлення, що такої немає.
3. Високий рівень. Створити консольний застосунок, який читає список фотоархівів із файлу (archive;photos;msPerPhoto;serialPercent) і для кожного архіву обирає кількість ядер за бюджетом часу (--budget <хв>) і мінімальною ефективністю (--min-eff <%>). Програма виводить таблицю рекомендацій із підсумковою кількістю ядеро-годин і сумарним часом, а архіви, для яких рішення немає, перелічує в потоці помилок. Підтримуються опції --max-cores, --help; коди завершення: 0 – усі архіви мають рішення, 4 – не всі, 1/2 – помилки аргументів і файлу.
Варіант 7. Послідовності ДНК
1. Початковий рівень. Створити консольну програму, яка генерує дві випадкові послідовності ДНК (алфавіт ACGT, по
2. Базовий рівень. Створити консольну програму, яка запитує довжину послідовностей ДНК і кількість запусків, перевіряє введення, вимірює з прогріванням медіани часу генерації, порівняння та підрахунку частоти нуклеотидів. Програма виводить таблицю етапів із частками, частку паралельного коду (порівняння й підрахунок) і прогноз прискорення за законом Амдала для 2–16 ядер.
3. Високий рівень. Створити консольний застосунок, який читає послідовності ДНК з двох файлів у форматі FASTA (шляхи – аргументи), вимірює етапи читання, перевірки алфавіту, порівняння та пошуку найдовшого спільного фрагмента однакових позицій, і виводить звіт із частками етапів і прогнозом Амдала. Опція --repeat <n> задає кількість запусків (медіана), --help – довідка; недопустимі символи з номерами рядків виводяться в потік помилок, коди завершення 0/1/2.
Варіант 8. Паспорт комп’ютера
1. Початковий рівень. Створити консольну програму, яка виводить відомості про комп’ютер: операційну систему, архітектуру процесу, версію .NET, кількість логічних процесорів, доступну пам’ять і точність таймера Stopwatch.
2. Базовий рівень. Створити консольну програму, яка формує паспорт комп’ютера у вигляді вирівняної таблиці (ОС, ім’я комп’ютера без персональних даних користувача, архітектура, версія й RID .NET, логічні процесори, пам’ять, режим збирача сміття, конфігурація Debug або Release) і додає результат короткого тесту швидкодії: медіану 5 запусків обчислення суми гармонічного ряду для
3. Високий рівень. Створити консольний застосунок, який записує паспорт комп’ютера у файл Markdown (--out passport.md): таблиці «Система», «Процесор і пам’ять», «.NET», «Тест швидкодії» (медіана, мінімум, максимум, відхилення). Опція --compare <інший.md> читає раніше збережений паспорт і виводить відношення часу тесту двох комп’ютерів. Попередження, якщо програму запущено в конфігурації Debug, виводиться в потік помилок; опція --help; коди завершення 0/1/2.
Варіант 9. Вебсервер
1. Початковий рівень. Створити консольну програму, яка моделює пропускну здатність вебсервера: один запит обробляється 40 мс, з яких 10 % припадає на послідовний доступ до спільного журналу. Програма виводить кількість запитів за секунду для 1, 2, 4, 8 і 16 ядер за законом Амдала.
2. Базовий рівень. Створити консольну програму, яка запитує час обробки одного запиту в мілісекундах, частку послідовної роботи та очікуване навантаження (запитів за секунду), перевіряє введення й виводить таблицю пропускної здатності та завантаження сервера для 1–64 ядер і мінімальну кількість ядер, за якої завантаження не перевищує 80 %.
3. Високий рівень. Створити консольний застосунок, який читає з CSV-файлу погодинний прогноз навантаження (hour;requests) і за параметрами --request-ms, --serial та --max-load <%> визначає для кожної години мінімальну кількість ядер. Програма виводить таблицю годин, пікову годину, максимальну потрібну кількість ядер і оцінку вартості за ціною ядро-години (--price). Помилки – у потік помилок, опція --help, коди 0/1/2.
Варіант 10. Бібліотечний каталог
1. Початковий рівень. Створити консольну програму, яка генерує каталог із 500 000 книг (назва, автор, рік, фіксоване зерно), вимірює час генерації, пошуку книг заданого автора та сортування за роком і виводить час і частку кожного етапу.
2. Базовий рівень. Створити консольну програму, яка запитує кількість книг у каталозі та кількість запусків, перевіряє введення, виконує прогрівання й вимірює медіани етапів «генерація», «пошук за автором», «сортування за назвою» і «групування за роком». Програма виводить таблицю етапів із частками, вказує найповільніший етап і прогнозує прискорення програми, якщо розпаралелити лише його.
3. Високий рівень. Створити консольний застосунок, який завантажує каталог книг із CSV-файлу, виконує операції, перелічені в опції --ops load,search,sort,group, з кількістю запусків --runs, і виводить таблицю медіан, мінімумів і часток етапів. Для кожного етапу програма окремо прогнозує прискорення програми на 8 ядрах, якщо розпаралелити саме цей етап, і записує звіт у файл (--report). Опція --help, помилки файлу з номером рядка – у потік помилок, коди 0/1/2.
Варіант 11. Спортивний рейтинг
1. Початковий рівень. Створити консольну програму, яка генерує результати 1 000 000 матчів (фіксоване зерно), обчислює рейтинг команд і вимірює час обчислення: окремо перший запуск і медіану 10 наступних запусків.
2. Базовий рівень. Створити консольну програму, яка запитує кількість матчів і кількість запусків, перевіряє введення, вимірює обчислення рейтингу команд із прогріванням і виводить мінімум, медіану, середнє, максимум і відносне стандартне відхилення, а також попередження, якщо відхилення перевищує 5 %.
3. Високий рівень. Створити консольний застосунок-бенчмарк обчислення спортивного рейтингу, який порівнює два способи підрахунку очок (словник і масив за номером команди) для кількостей матчів з опції --matches 1e5,1e6,1e7. Опції --warmup, --runs, --csv <файл> і --help. Програма виводить таблицю статистик (медіана, мінімум, відхилення, відношення двох способів), перевіряє однаковість рейтингів і повертає код 3, якщо вони відрізняються; помилки – у потік помилок.
Варіант 12. Трасування променів
1. Початковий рівень. Створити консольну програму, яка для трасувальника променів із частками етапів, заданими в програмі (побудова сцени 3 %, трасування 90 %, фільтрація 5 %, запис файлу 2 %; паралелізуються трасування й фільтрація), виводить загальне прискорення програми за законом Амдала для 1–64 ядер.
2. Базовий рівень. Створити консольну програму, яка запитує етапи трасувальника (назва, частка часу у відсотках, чи паралелізується, власна частка паралельного коду етапу), перевіряє, що сума часток дорівнює 100 %, і виводить таблицю сильної масштабованості програми:
3. Високий рівень. Створити консольний застосунок, який читає опис етапів трасувальника з JSON-файлу та розмір зображення, будує таблицю сильної масштабованості для кількостей ядер з опції --cores і визначає етап, що обмежує прискорення на максимальній кількості ядер. З опцією --csv таблиця записується у файл для побудови графіка. Помилки формату JSON і суми часток – у потік помилок з кодом 2; опція --help.
Варіант 13. Шаховий рушій
1. Початковий рівень. Створити консольну програму, яка для шахового рушія з частками часу, заданими в програмі (генерація дебютної бази 7 %, паралельний перебір позицій 93 %), обчислює прискорення й кількість переглянутих позицій за 10 с для 1, 2, 4, 8 і 16 ядер, якщо одне ядро переглядає 2 млн позицій за секунду.
2. Базовий рівень. Створити консольну програму, яка запитує частку паралельного перебору, швидкість одного ядра (позицій за секунду) і вартість ядра за годину, перевіряє введення й виводить таблицю для 1–64 ядер: прискорення, позиції за 10 с, вартість години й кількість позицій на гривню. Програма вказує конфігурацію з найкращим співвідношенням «позиції / вартість».
3. Високий рівень. Створити консольний застосунок, який читає вимірювання часу перебору шахових позицій на різній кількості потоків із CSV-файлу, обчислює --price і --budget задають вартість і бюджет для вибору конфігурації; --help; помилки – у потік помилок; коди 0/1/2.
Варіант 14. Число π рядом Лейбніца
1. Початковий рівень. Створити консольну програму, яка обчислює число Math.PI та час обчислення кожного варіанта.
2. Базовий рівень. Створити консольну програму, яка запитує потрібну кількість правильних десяткових знаків числа
3. Високий рівень. Створити консольний застосунок, який порівнює ряд Лейбніца, ряд Нілаканта та формулу Мачіна для кількостей членів з опції --terms і записує в CSV-файл (--csv) таблицю «метод, --runs, --help; помилки – у потік помилок; коди 0/1.
Варіант 15. Хмарна оренда
1. Початковий рівень. Створити консольну програму, яка для розрахункової задачі з часом 40 год на одному ядрі й часткою паралельного коду 97 % обчислює час виконання та вартість оренди віртуальних машин на 2, 4, 8, 16, 32 і 64 ядра за ціною 0,05 дол. за ядро-годину.
2. Базовий рівень. Створити консольну програму, яка запитує час задачі на одному ядрі, частку паралельного коду, ціну ядро-години та дедлайн у годинах, перевіряє введення й виводить таблицю конфігурацій віртуальних машин (1–128 ядер): час, вартість, ефективність. Програма обирає найдешевшу конфігурацію, що вкладається в дедлайн.
3. Високий рівень. Створити консольний застосунок, який читає каталог типів віртуальних машин з CSV (name;cores;pricePerHour) і список задач з іншого файлу (task;hoursOn1Core; parallelPercent;deadlineHours). Для кожної задачі програма обирає найдешевший тип машини в межах дедлайну, виводить таблицю призначень із підсумковою вартістю, а задачі без рішення – у потік помилок. Опції --hourly-billing (округлення до цілих годин) і --help; коди 0/1/2/4.
Варіант 16. Кеш процесора
1. Початковий рівень. Створити консольну програму, яка обчислює суму елементів масивів long[] розміром від 1 КБ до 256 МБ (кожен наступний у 4 рази більший) і виводить час обходу одного елемента в наносекундах для кожного розміру.
2. Базовий рівень. Створити консольну програму, яка запитує мінімальний і максимальний розмір масиву в кілобайтах та кількість запусків, перевіряє введення, для кожного розміру (множник 2) вимірює медіану часу випадкового доступу до елементів і виводить таблицю: розмір, наносекунд на звернення, відношення до найменшого розміру. Програма позначає розміри, після яких час на звернення зростає більш ніж у 1,5 раза.
3. Високий рівень. Створити консольний застосунок, який шукає межі кешу процесора: вимірює час послідовного та випадкового доступу для розмірів з опцій --from, --to, --step, будує таблицю й записує CSV (--csv), а також визначає «сходинки» часу доступу й порівнює їх із розмірами кешу L1, L2, L3, заданими опцією --cache 48K,512K,16M. Опції --runs, --help; помилки – у потік помилок; коди 0/1.
Варіант 17. Університетський кластер
1. Початковий рівень. Створити консольну програму, яка для сіткової задачі з послідовною часткою 2 % виводить масштабоване прискорення за законом Густафсона та розмір сітки для слабкої масштабованості (на одному процесорі –
2. Базовий рівень. Створити консольну програму, яка запитує послідовну частку, розмір сітки на один процесор і кількість вузлів кластера та ядер на вузлі, перевіряє введення й виводить таблицю слабкої масштабованості: вузли, ядра, розмір сітки, прискорення за Густафсоном і ефективність.
3. Високий рівень. Створити консольний застосунок, який читає результати слабкої масштабованості кластера з CSV (nodes;coresPerNode;cells;seconds), обчислює ефективність слабкої масштабованості --predict <вузли> прогнозує час для більшої конфігурації; --help; помилки – у потік помилок; коди 0/1/2.
Варіант 18. Навчання нейромережі
1. Початковий рівень. Створити консольну програму, яка для навчання нейромережі (одна епоха на одному GPU – 30 хв, частка паралельної роботи 90 %) виводить за законом Амдала час епохи й прискорення для 1, 2, 4 і 8 GPU та загальний час 50 епох.
2. Базовий рівень. Створити консольну програму, яка запитує час епохи на одному GPU, кількість епох, частку паралельної роботи та частку часу на синхронізацію градієнтів, яка додається на кожен додатковий GPU. Після перевірки введення програма виводить таблицю для 1–64 GPU і кількість GPU, за якої час навчання мінімальний.
3. Високий рівень. Створити консольний застосунок, який моделює навчання нейромережі на кластері з вузлами по 4 або 8 GPU: параметри моделі (--epoch-min, --epochs, --parallel, --sync-intra, --sync-inter) і список конфігурацій із файлу (nodes;gpusPerNode). Програма виводить таблицю часу навчання, прискорення, ефективності й вартості (--gpu-price) і найкращу конфігурацію за часом і за вартістю. Опція --help; помилки – у потік помилок; коди 0/1/2.
Варіант 19. Складська логістика
1. Початковий рівень. Створити консольну програму, яка за заданим у програмі журналом запусків оптимізатора складських маршрутів (кількість потоків і час) обчислює прискорення та ефективність і виводить кількість потоків із найбільшим прискоренням.
2. Базовий рівень. Створити консольну програму, яка читає з клавіатури журнал запусків оптимізатора маршрутів (рядки потоки час, кілька запусків на кількість потоків), перевіряє введення, для кожної кількості потоків обчислює медіану та виводить таблицю
3. Високий рівень. Створити консольний застосунок, який аналізує журнал запусків складського оптимізатора з текстового файлу (2026-09-01 12:00:03 threads=8 ms=1532), групує записи за датою та кількістю потоків, відкидає викиди (значення, що відрізняються від медіани більш ніж на 20 %), виводить таблицю метрик за кожен день і записує CSV-звіт (--csv). Опції --from, --to (дати), --help; нерозпізнані рядки – у потік помилок; коди 0/1/2.
Варіант 20. Сейсмічні дані
1. Початковий рівень. Створити консольну програму, яка порівнює виміряне прискорення обробки сейсмічних даних (задане в програмі для 2, 4, 8 і 16 потоків: 1,9; 3,5; 6,1; 8,7) з теоретичним за законом Амдала для
2. Базовий рівень. Створити консольну програму, яка запитує частку паралельного коду обробки сейсмічних даних і виміряні часи для кількох кількостей потоків, перевіряє введення, виводить таблицю виміряного й теоретичного прискорення з відносною різницею та позначає аномалії: надлінійне прискорення і відхилення від теорії понад 15 %.
3. Високий рівень. Створити консольний застосунок, який обробляє CSV-файл вимірювань кількох сейсмічних задач (task;threads;run;ms), для кожної задачі оцінює частку --threshold <%>, --csv, --help; помилки – у потік помилок; коди 0/1/2.
Варіант 21. Компіляція проєкту
1. Початковий рівень. Створити консольну програму, яка моделює збирання проєкту з 12 модулів, що компілюються незалежно (час кожного модуля задано в програмі), і послідовного лінкування 20 с, та виводить час збирання на 1, 2, 4 і 8 ядрах за умови рівномірного розподілу модулів.
2. Базовий рівень. Створити консольну програму, яка запитує часи компіляції модулів (через пробіл) і час лінкування, перевіряє введення й для 1–16 ядер моделює розподіл модулів жадібним алгоритмом (найдовший модуль – на найменш завантажене ядро). Програма виводить таблицю часу збирання, прискорення, ефективності та порівнює з прогнозом закону Амдала.
3. Високий рівень. Створити консольний застосунок, який читає опис проєкту з файлу (module;seconds; dependsOn) і моделює паралельне збирання з урахуванням залежностей: модуль компілюється після своїх залежностей, одночасно працює не більше --cores програма виводить таблицю часу, прискорення й максимального паралелізму та критичний шлях залежностей. Циклічні залежності – у потік помилок з кодом 3; --help; коди 0/1/2/3.
Варіант 22. Медичні знімки
1. Початковий рівень. Створити консольну програму, яка для обробки медичних знімків (час на одному ядрі 90 хв, частка паралельного коду 94 %, споживання 15 Вт на активне ядро) виводить час обробки та споживану енергію у ват-годинах для 1, 2, 4, 8 і 16 ядер.
2. Базовий рівень. Створити консольну програму, яка запитує час обробки на одному ядрі, частку паралельного коду, потужність активного ядра й потужність простою ядра, перевіряє введення та виводить таблицю для 1–32 ядер: час, ефективність, енергія (з урахуванням простою ядер під час послідовної частини). Програма вказує кількість ядер із мінімальною енергією та з мінімальним добутком «енергія × час».
3. Високий рівень. Створити консольний застосунок, який читає пакет досліджень з файлу (study;images; secondsPerImage;serialPercent), параметри живлення з опцій --active-w, --idle-w і обмеження --max-hours, та для кожного дослідження обирає кількість ядер із мінімальною енергією в межах обмеження часу. Програма виводить таблицю рішень і сумарну енергію; неможливі дослідження – у потік помилок; --help; коди 0/1/2/4.
Варіант 23. Фізика частинок
1. Початковий рівень. Створити консольну програму, яка за заданими в програмі часами моделювання частинок на 1, 2, 4 і 8 потоках (160, 75, 36, 19 с) обчислює прискорення та ефективність і виводить повідомлення для кожної конфігурації з надлінійним прискоренням.
2. Базовий рівень. Створити консольну програму, яка запитує кількість частинок, розмір однієї частинки в байтах, розмір кешу L2 і L3 та виміряні часи для кількох кількостей потоків. Після перевірки введення програма виводить таблицю
3. Високий рівень. Створити консольний застосунок, який вимірює час оновлення координат частинок (масив структур) для різних кількостей частинок (--counts) і порівнює час на одну частинку з розмірами кешу (--cache). Програма виводить таблицю, позначає «сходинки» часу, прогнозує, за якої кількості потоків частина даних на потік вміститься в кеш L3, і записує CSV (--csv). Опції --runs, --help; помилки – у потік помилок; коди 0/1.
Варіант 24. Перевірка орфографії
1. Початковий рівень. Створити консольну програму, яка генерує тексти з 10 000, 100 000 і 1 000 000 слів (фіксоване зерно), перевіряє кожне слово за словником HashSet<string> і виводить кількість невідомих слів і час перевірки для кожного тексту.
2. Базовий рівень. Створити консольну програму, яка запитує розміри текстів у словах (через пробіл) та кількість запусків, перевіряє введення, вимірює медіани часу перевірки орфографії з прогріванням і виводить таблицю: слова, медіана, мікросекунд на слово. Програма лінійно екстраполює час для тексту обсягом 50 млн слів.
3. Високий рівень. Створити консольний застосунок, який читає словник і текстові файли з теки (аргументи), вимірює етапи «читання», «розбиття на слова», «перевірка» для кожного файлу, будує таблицю залежності часу від обсягу, оцінює лінійну модель методом найменших квадратів і прогнозує час для обсягу з опції --predict <слова>. Опції --runs, --csv, --help; помилки читання файлів – у потік помилок; коди 0/1/2.
Варіант 25. Торговий робот
1. Початковий рівень. Створити консольну програму, яка для торгового робота (обробка одного котирування 2 мс, з них 0,3 мс – послідовний запис у журнал угод) виводить максимальну кількість котирувань за секунду для 1, 2, 4, 8 і 16 ядер і межу прискорення.
2. Базовий рівень. Створити консольну програму, яка запитує час обробки котирування, частку послідовної роботи та потік котирувань за секунду, перевіряє введення й виводить таблицю для 1–64 ядер: пропускна здатність, середня затримка, чи встигає робот обробляти потік. Програма повідомляє, якщо потік перевищує межу прискорення за будь-якої кількості ядер.
3. Високий рівень. Створити консольний застосунок, який читає з файлу журнал котирувань із мітками часу (HH:mm:ss.fff;symbol;price), обчислює пікове навантаження за кожну секунду і за параметрами обробки (--ms, --serial) визначає мінімальну кількість ядер, за якої робот встигає обробити пік. Програма виводить таблицю секунд із перевантаженням для заданої кількості ядер (--cores) і підсумки. --help; помилки – у потік помилок; коди 0/1/2/4.
Варіант 26. Архіватор
1. Початковий рівень. Створити консольну програму, яка для архіватора з часами етапів, заданими в програмі (читання файлів 30 с, стиснення 240 с, запис архіву 20 с), обчислює частку паралельного коду та прогноз часу архівації для 2, 4, 8, 16 і 32 ядер.
2. Базовий рівень. Створити консольну програму, яка створює тимчасовий файл заданого користувачем розміру в мегабайтах (перевірка від 1 до 1024) з випадковими даними, вимірює час читання, стиснення GZipStream у пам’ять і запису архіву, виводить таблицю етапів із частками і прогноз Амдала для 2–32 ядер, а потім видаляє тимчасові файли.
3. Високий рівень. Створити консольний застосунок, який архівує файли теки (аргумент) у GZip, вимірює етапи читання, стиснення та запису для кожного файлу й загалом, обчислює частку паралельного коду та прогнозує час для ядер з опції --cores. Опції --level fastest|optimal|smallest, --out <тека>, --help. Звіт містить таблицю файлів, ступінь стиснення й підсумок; помилки доступу до файлів – у потік помилок; коди 0/1/2.
Варіант 27. Аналіз соцмережі
1. Початковий рівень. Створити консольну програму, яка для аналізу графа соцмережі з накладними витратами
2. Базовий рівень. Створити консольну програму, яка запитує цільову ефективність (від 50 до 99 %) і максимальну кількість процесорів, перевіряє введення та для моделі накладних витрат
3. Високий рівень. Створити консольний застосунок, який будує таблиці ізоефективності для кількох моделей накладних витрат (--model plogp|p|p2) і цільових ефективностей (--eff 0.6,0.7,0.8), визначає функцію ізоефективності кожної моделі та записує таблиці в CSV (--csv). Для файлу з вимірюваннями (--measured) програма обирає модель, що найкраще описує дані. --help; помилки – у потік помилок; коди 0/1/2.
Варіант 28. Бенчмарк сортувань
1. Початковий рівень. Створити консольну програму, яка генерує масив із 5 000 000 випадкових цілих чисел (фіксоване зерно) і вимірює час сортування його копій методом Array.Sort та власним сортуванням злиттям.
2. Базовий рівень. Створити консольну програму, яка запитує розмір масиву та кількість запусків, перевіряє введення, з прогріванням вимірює сортування копій одного масиву трьома алгоритмами (Array.Sort, злиттям, швидке) і виводить таблицю: медіана, мінімум, максимум, відхилення, відношення до Array.Sort, а також перевіряє, що результати відсортовані однаково.
3. Високий рівень. Створити консольний застосунок-бенчмарк сортувань для розмірів з опції --sizes і типів даних --data random,sorted,reversed,few-unique, що виводить таблицю медіан із 95-відсотковими довірчими інтервалами (за --runs, --csv, --help; код 3 – якщо результат сортування некоректний.
Варіант 29. Гібридні ядра
1. Початковий рівень. Створити консольну програму, яка для процесора з 6 P-ядрами і 8 E-ядрами (E-ядро працює зі швидкістю 60 % від P-ядра) і задачі з часткою паралельного коду 95 % виводить прискорення при використанні лише P-ядер, лише E-ядер і всіх ядер.
2. Базовий рівень. Створити консольну програму, яка запитує кількість P-ядер, E-ядер, відносну швидкість E-ядра та частку паралельного коду, перевіряє введення та виводить таблицю прискорення для всіх комбінацій кількості задіяних P- і E-ядер (послідовна частина завжди виконується на P-ядрі) і найкращу комбінацію з ефективністю не менше 70 %.
3. Високий рівень. Створити консольний застосунок, який моделює виконання набору задач на гібридному процесорі: параметри процесора (--p-cores, --e-cores, --e-speed) і задачі з CSV-файлу (task;seconds;parallelPercent). Програма порівнює стратегії розподілу «лише P», «усі ядра», «довгі задачі на P» і виводить таблицю загального часу, середнього прискорення й завантаження ядер для кожної стратегії. --help; помилки – у потік помилок; коди 0/1/2.
Варіант 30. Запуск ракети (симуляція)
1. Початковий рівень. Створити консольну програму, яка для симуляції запуску ракети (підготовка моделі 5 хв, розрахунок траєкторій 180 хв, візуалізація 10 хв, паралелізується лише розрахунок) виводить прогнозований час симуляції для кластера з 1, 2, 4 і 8 вузлів по 16 ядер.
2. Базовий рівень. Створити консольну програму, яка запитує час етапів симуляції, кількість ядер у вузлі та накладні витрати на обмін між вузлами (хвилини на кожен додатковий вузол), перевіряє введення й виводить таблицю для 1–32 вузлів: час, прискорення, ефективність і кількість вузлів із мінімальним часом.
3. Високий рівень. Створити консольний застосунок, який читає параметри симуляції з JSON-файлу (етапи, частки, накладні витрати) і перелік конфігурацій кластерів з CSV (cluster;nodes;coresPerNode;pricePerNodeHour), виводить таблицю часу й вартості для кожної конфігурації та обирає найдешевшу, що вкладається в дедлайн (--deadline <год>). З опцією --sweep програма додатково будує таблицю залежності часу від кількості вузлів. --help; помилки – у потік помилок; коди 0/1/2/4.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань.
- Встановити .NET 10 SDK і JetBrains Rider (за потреби – Ubuntu 26.04 у WSL2), перевірити встановлення командою
dotnet --info. - Скласти звіт про апаратну конфігурацію свого комп’ютера: модель процесора, кількість ядер і логічних процесорів, розміри кешу, обсяг пам’яті, версії ОС і .NET.
- Створити в Rider рішення та консольний проєкт і реалізувати завдання обраного рівня складності.
- Виконати вимірювання в конфігурації Release з прогріванням і кількома запусками; навести медіану часу.
- Порівняти отримані значення з прогнозами законів Амдала й Густафсона та пояснити розбіжності.
- Продемонструвати роботу програми викладачеві, пояснити програмний код і результати вимірювань, відповісти на контрольні питання.