Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

18.09.2024

Оптимізація паралельними обчисленнями

Щоб вже закінчити тему з оптимізацією, додав розвʼязок з паралельними обчисленнями до gist.

Вийшло знову несподівано. Я очікував, що, оскільки програма складається на 100% з арифметики, то розпаралелити її можна практично ідеально, тобто ділити час виконання на число ядер.

Технічно програма працює за ідіомами Go: декілька горутін, в кожної є канал на вхід та канал на вихід. Кожна горутіна обробляє частину масиву даних; також є головний потік, який керує процесом та агрегує результати.

Вийшло так, що впровадження горутін уповільнило програму приблизно на 60%. Це якщо горутіна одна, що мало б бути еквівалентно непаралельному рішенню. Стільки часу уходить на синхронізацію. Особливість нашої програми в тому, що кожна ітерація спирається на показник, похідний від усіх результатів попередньої. Виходить, що десь 3000 разів на секунду контроль переходить між головною та робочою горутіною.

Хороші новини, що збільшення кількості горутін все ж дає очікуваний пропорційний приріст.. Тобто в чотири потоки програма все ж на 60% швидше за послідовну — але не на 75, як хотілося б. Більше в мене ядер немає, але гадаю, чим більше ядер — тим виправданіше паралелізація.