Label1.Caption:=format('0 %s',[delay_names]);
end;
//уборка мусора
procedure Tfrm_img.FormDestroy(Sender: TObject);
begin
img_errmsg[0].Free;
end;
//Гауссово размытие с применением расширения SSE
procedure Tfrm_img.act_effBlurGauseExecute(Sender: TObject);
var
b: TBitmap;
fticks:Cardinal;
begin
if (frm_imgbluropts.ShowModal=mrYes) then begin
fticks:=MilliSecondOfTheDay(Now);
img_des.Picture.LoadFromFile(img_OpenPictureDialog.FileName);
GBlur(img_des.Picture.Bitmap,frm_imgbluropts.ComboBox1.ItemIndex,True);
fticks:=MilliSecondOfTheDay(Now)-fticks;
img_log.lines.add(format('make action="copy blur SSE" at="%d" milliseconds',[fticks]));
Label1.Caption:=format('%d %s',[fticks,delay_names]);
end;
end;
//сохранить результат
procedure Tfrm_img.act_desSaveImageExecute(Sender: TObject);
begin
if (img_SavePictureDialog.Execute) then begin
img_des.Picture.SaveToFile(img_SavePictureDialog.FileName);
end;
end;
//центрировать результат
procedure Tfrm_img.act_desCenterImgExecute(Sender: TObject);
begin
with (sender as taction) do begin
img_des.Center:=Checked;
end;
end;
//растянуть результат
procedure Tfrm_img.act_desStrechImgExecute(Sender: TObject);
begin
with (sender as taction) do begin
img_des.Stretch:=Checked;
end;
end;
//центрировать источник
procedure Tfrm_img.act_srcCenterImgExecute(Sender: TObject);
begin
with (sender as taction) do begin
img_src.Center:=Checked;
end;
end;
//растянуть источник
procedure Tfrm_img.act_srcStrechImgExecute(Sender: TObject);
begin
with (sender as taction) do begin
img_src.Stretch:=Checked;
end;
end;
//Гауссово размытие без SSE (простое)
procedure Tfrm_img.act_effBlurGauseNoSSEExecute(Sender: TObject);
var
b: TBitmap;
fticks:Cardinal;
begin
if (frm_imgbluropts.ShowModal=mrYes) then begin
fticks:=MilliSecondOfTheDay(Now);
img_des.Picture.LoadFromFile(img_OpenPictureDialog.FileName);
GBlur(img_des.Picture.Bitmap,frm_imgbluropts.ComboBox1.ItemIndex,False);
fticks:=MilliSecondOfTheDay(Now)-fticks;
img_log.lines.add(format('make action="copy blur" at="%d" milliseconds',[fticks]));
Label1.Caption:=format('%d %s',[fticks,delay_names]);
end;
end;
Рисунок 3-1 вкладка "источник"
Рисунок 3-2 вкладка "результат"
Сравним производительность при использовании оптимизации кода приложения под расширение SIMD процессора SSE и CPU. Тест производился на процессоре Intel® Core™2 DuoCPUT8300 2,4Ghz с поддержкой MMX,SSE-SSE4, EM64T.
Таблица 4-1
Сравнение времени обработки изображения 800х800 | ||||
№ | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего |
1 | 840 | 1 032 | 1,2286 | 0,0071 |
2 | 841 | 1 047 | 1,2449 | 0,0093 |
3 | 832 | 1 033 | 1,2416 | 0,0059 |
4 | 839 | 1 028 | 1,2253 | 0,0104 |
5 | 836 | 1 035 | 1,2380 | 0,0024 |
Таблица 4-2
Сравнение времени обработки изображения 1024х768 | ||||
№ | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего |
1 | 1 589 | 1 940 | 1,2209 | 0,0331 |
2 | 1 529 | 1 955 | 1,2786 | 0,0246 |
3 | 1 560 | 1 956 | 1,2538 | 0,0002 |
4 | 1 551 | 1 954 | 1,2598 | 0,0058 |
5 | 1 545 | 1 942 | 1,2570 | 0,0029 |
Таблица 4-3
Сравнение времени обработки изображения 1600х1200 | ||||
№ | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего |
1 | 2 369 | 3 037 | 1,2820 | 0,0195 |
2 | 2 403 | 3 021 | 1,2572 | 0,0053 |
3 | 2 406 | 3 005 | 1,2490 | 0,0135 |
4 | 2 389 | 2 989 | 1,2512 | 0,0113 |
5 | 2 374 | 3 022 | 1,2730 | 0,0105 |
Таблица 4-4
Сравнение времени обработки изображения 2560х1600 | ||||
№ | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего |
1 | 5 054 | 6 332 | 1,2529 | 0,0062 |
2 | 5 058 | 6 365 | 1,2584 | 0,0007 |
3 | 5 050 | 6 376 | 1,2626 | 0,0035 |
4 | 5 024 | 6 321 | 1,2582 | 0,0009 |
5 | 4 968 | 6 277 | 1,2635 | 0,0044 |
[1] промежуточный буфер с быстрым доступом
[2] архитектура Intel (Intelarchitecture)
[3] Указанный режим работы не является согласованным с требованиями стандарта IEEE 754
[4] Определяет формат хранения мантиссы, экспоненты и знака, форматы положительного и отрицательного нуля, плюс и минус бесконечностей, а также определение «не числа» (NaN), методы, обработку ситуаций
[5] Not a Number - не число
[6]Quiet NaN - "тихий NaN"
[7]Signalling NaN - "сигнализирующий NaN"