Увлёкся задачкой удаления шумов с фотографии, написал программку... экспериментирую. Получается не хуже чем в фотошопе. Алгоритмы бывают медленные, надо ждать ответа несколько минут. Когда много экспериментируешь, чуть изменяешь параметры, снова запускаешь, то ждать так много как бы не очень хочется. Понятно, что можно распараллелить на несколько ядер, но это даст ускорение всего в четыре раза (у меня 4 ядра). Да и не факт, что в 4, так как основной затык в памяти.
Программа скачет по большущему двумерному массиву вещественных чисел, который в кэш процессора, конечно же, целиком не помещается. То есть куча времени тратится на загрузку данных из памяти в процессор.
Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".
Латентность кэша:
L1 1 ns
L2 3 ns
L3 3.8 ns
Латентность хорошей памяти 1866 МГц где-то от 40 ns (у моей хуже, моя 1600 МГц).
Вот думаю, оно правда на одном ядре сразу же раз в десять-пятнадцать быстрее будет?
Стоит ли связываться...