Предположим, что общий скользящий алгоритм выполняет некоторую функцию в ядре, например, средний фильтр (средний фильтр) или сумма абсолютных разностей алгоритм обработки изображений.Когда ядро переместится на следующую позицию, произойдет некоторое избыточное чтение из памяти, поскольку данные, вложенные в новое ядро, будут несколько перекрывать данные предыдущего.
Позвольте мне объяснить на практическом примере ... Предположим, чтоВы хотите выполнить медианный фильтр для большой двумерной матрицы с размером ядра (окна) 3x3.Первая позиция ядра (красная на изображении ниже) будет центрирована в (1,1), вторая позиция (зеленая) будет в центре (1,2).Обратите внимание на то, как желтая область перекрывается, и теперь эти значения необходимо перезагружать из памяти.
meanfilter http://luka.s3.amazonaws.com/meanfilter.png
Моя конкретная проблема - средний 3D-фильтр, поэтому перекрытие еще больше(3 ^ 3-3 ^ 2 = 18 для 3D против 3 ^ 2-3 = 6 для 2D).
Я уверен, что это общая проблема ... Кто-нибудь знает, как такие алгоритмы, как этотреализованы эффективно для устранения избыточных поисков памяти или для использования пространственной и временной локализации кэша ЦП на современных архитектурах (например, 2-сторонний ассоциативный кэш)?
Моя конкретная проблема в 3D требует только среднего значения от6 ближайших соседей (не диагональных) и реализованы в C следующим образом:
for( i = 0; i <= maxi; i++ ) {
for( j = 0; j <= maxj; j++ ) {
for( k = 0; k <= maxk; k++ ) {
filteredData[ i ][ j ][ k ] =
ONE_SIXTH *
(
data[ i + 1 ][ j ][ k ] +
data[ i - 1 ][ j ][ k ] +
data[ i ][ j + 1 ][ k ] +
data[ i ][ j - 1 ][ k ] +
data[ i ][ j ][ k + 1 ] +
data[ i ][ j ][ k - 1 ]
);
}
}
}