Есть простая задача — сжимать видео в реальном времени. Сделал оптимизацию под многоядерники таким образом (это типа таймлайн)
— поступает кадр
— ищем свободный поток в нашем пуле потоков
— отдаем потоку кадр на сжатие
— смотрим, какие кадры уже сжались в других потоках, скидываем на диск
— goto 10
Видео приходится жать неслабых размеров (грубо говоря от 2000х2000 и до 1000х1000). Сильного прироста по скорости не заметил, при увеличении кол-ва используемых ядер (потоков). Профайлером прогнать сложно — специфика задачи. И вот что мне подумалось — пока уже поступивший кадр в обработке, предположим, что он весь лежит в L2 кеше (или его часть, в зависимости от размеров). И тут опа, еще один кадр — ядра начинают бороться за кеш (если он у них объединенный), а тут еще один. В результате выигрыша мы так и не получаем. Я правильно думаю?
И вот что я нарешал: не делить кадры поядерно, а разделять один кадр между ядрами, благо алгоритм сжатия позволяет это сделать. Если не брать в учет кеши и прочую ерунду, то у этих вариантов скорость должна быть равна. Но во втором случае в один момент времени идет работа над одним кадром и значит, конкуренция за кеш будет значительно меньше. То есть, это реальная возможность поднять скорость сжатия.
Гуру, подскажите, где я неправ?