Друзья! Хорошие новости! 🔥 Я реализовал параллелизм: API для вызова пользовательских функций в многопоточном режиме 🤩. Т.е. параллельный for, одномерный и двумерный. В частности, API будет вызывать вашу функцию для каждой строки экрана, для группы из нескольких пикселей (например, для 64-х) или для каждого пикселя в отдельности.
Самый медленный вариант (как можно догадаться) — использование попиксельных вызовов, т.к. он связан в большим кол-вом накладных расходов на вычисления и вызов функции. На моём компьютере такой режим позволяет достигать 1537 fps для FullHD (против 1112 fps для однопоточного режима) без учёта вывода на экран. Но это для отрисовки банального XOR-паттерна. Для таких простых операций использовать попиксельный режим неэффективно. Построчный или 64-пиксельный работает гораздо быстрее (до 6521 fps). Однако, если добавить в код холостой цикл на 1000 итераций, разница в попиксельном режиме будет куда существеннее: 32,34 fps в многопоточном коде против 2,21 fps в однопоточном (ускорение в 14,639 раз). Т.е. для сложных алгоритмов (реймаршинг, фракталы) такой режим можно использовать.
Первый алгоритм for, который я сделал 2 дня назад (в таблице он обозначен "первая реализация"), работал ощутимо медленнее, т.к. был сделан совсем по-простому. Сегодня я его оптимизировал в 2.7-100 раз для однопиксельных режимов и до 4.5 раз для 64-пиксельных режимов работы. Но это, конечно, далеко не финальная оптимизация, там есть ещё над чем работать 😎
Так что друзья, можно сказать, что идея себя оправдала, параллелизм позволяет добиться существенного ускорения (у меня вышло до 16,7 раз для 20 потоков, из которых реальных ядер 12, остальные 8 — гипертреды) 🥳
Больше подробностей о тестровании скорости — в таблице (смотрите верхнюю половину, т.к. он учитывает только вычислительную часть, без вывода на экран, который вносит существенную лепту в скорость работы).
Самый медленный вариант (как можно догадаться) — использование попиксельных вызовов, т.к. он связан в большим кол-вом накладных расходов на вычисления и вызов функции. На моём компьютере такой режим позволяет достигать 1537 fps для FullHD (против 1112 fps для однопоточного режима) без учёта вывода на экран. Но это для отрисовки банального XOR-паттерна. Для таких простых операций использовать попиксельный режим неэффективно. Построчный или 64-пиксельный работает гораздо быстрее (до 6521 fps). Однако, если добавить в код холостой цикл на 1000 итераций, разница в попиксельном режиме будет куда существеннее: 32,34 fps в многопоточном коде против 2,21 fps в однопоточном (ускорение в 14,639 раз). Т.е. для сложных алгоритмов (реймаршинг, фракталы) такой режим можно использовать.
Первый алгоритм for, который я сделал 2 дня назад (в таблице он обозначен "первая реализация"), работал ощутимо медленнее, т.к. был сделан совсем по-простому. Сегодня я его оптимизировал в 2.7-100 раз для однопиксельных режимов и до 4.5 раз для 64-пиксельных режимов работы. Но это, конечно, далеко не финальная оптимизация, там есть ещё над чем работать 😎
Так что друзья, можно сказать, что идея себя оправдала, параллелизм позволяет добиться существенного ускорения (у меня вышло до 16,7 раз для 20 потоков, из которых реальных ядер 12, остальные 8 — гипертреды) 🥳
Больше подробностей о тестровании скорости — в таблице (смотрите верхнюю половину, т.к. он учитывает только вычислительную часть, без вывода на экран, который вносит существенную лепту в скорость работы).