Можно ли ускорить этот код модификации растрового изображения Delphi 6 с помощью SIMD или другого подхода? - PullRequest
2 голосов
/ 26 декабря 2011

У меня есть приложение Delphi 6, которое изменяет растровые изображения в режиме реального времени.В настоящее время я использую код, показанный ниже, чтобы быстро увеличить яркость и контрастность.Если бы операция была просто сложением или просто умножением, я мог бы увидеть, как можно использовать SIMD, но так как в нем используются как сложение, так и умножение, а также есть операция Trunc (), ограничивающая диапазонБайт, я не уверен, можно ли здесь использовать SIMD.Вот мои вопросы:

  1. Можно ли использовать SIMD с этим кодом, и знаете ли вы хороший пример кода, с которым я мог бы работать?Какое повышение скорости можно ожидать?
  2. Не будет ли (потенциальное) заполнение линий сканирования проблемой?
  3. Какие-либо общие советы по оптимизации для ускорения кода?

;

// A fast version of this function would be to only allow range reductions
//  as a power of 2 and then use shl operations instead of divisions.
procedure doBrightnessAndContrast(var clip: tbitmap; compressionRatio: double; shiftValue: Byte);
var
  p0: PByte;
  x,y: Integer;
begin
  for y := 0 to clip.Height-1 do
  begin
    p0 := clip.scanline[y];

    // Can't just do the whole buffer as a big block of bytes since the
    //  individual scan lines may be padded for CPU alignment.
    for x := 0 to clip.Width - 1 do
    begin
      // Red
      p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
      Inc(p0);
      // Green
      p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
      Inc(p0);
      // Green
      p0^ := IntToByte(Trunc(p0^ * compressionRatio) + shiftValue);
      Inc(p0);
    end;
  end;
end;

1 Ответ

2 голосов
/ 26 декабря 2011

Конечно, SSE или MMX возможны.

В вашем случае, однако, вы можете получить почти такое же повышение скорости, если предварительно вычислить таблицу из 256 записей, используя ваши уравнения.

Затем замените все вычисления простым поиском в таблице. Лучше всего, что на современных процессорах это даст почти такую ​​же скорость, как MMX / SSE.

...