Нет необходимости создавать дополнительные три версии изображения, просто обращайтесь к ним по-другому или используйте что-то вроде класса, который я создал здесь . Еще лучше, просто продублируйте матрицу 5х5 и вместо этого поверните их. Затем вы можете линейно сканировать изображение на все повороты (что хорошо).
Эта проблема не будет хорошо масштабироваться для параллельной обработки, поскольку узкое место, безусловно, связано с данными изображения. Наличие нескольких потоков, обращающихся к одним и тем же данным, замедлит их, особенно если потоки «не синхронизированы», то есть один поток проходит через изображение дальше, чем другие потоки, так что другие потоки заканчивают тем, что перезагружают данные, которые первый поток отбрасывает .
Итак, решение, которое я считаю наиболее эффективным, - это создать четыре потока, которые сканируют 5 строк изображения, по одному потоку за оборот. Пятый поток загружает данные изображения по одной строке за раз и передает строку в каждый из четырех потоков сканирования, ожидая завершения всех четырех потоков, то есть загружает одну строку изображения, добавляет в буфер пяти строк, запускает четыре потока сканирования , дождитесь окончания потоков и повторяйте, пока все строки изображения не будут прочитаны.