Performance 这个Delphi 6位图修改代码可以用SIMD或其他方法加速吗?
我有一个Delphi6应用程序,可以实时修改位图。目前,我正在使用下面显示的代码来快速提高亮度和对比度。如果操作只是一个加法或乘法,我可以看到如何使用SIMD,但由于加法和乘法都涉及,而且还有Trunc()操作将其限制在一个字节的范围内,我不确定这里是否可以使用SIMD。以下是我的问题:Performance 这个Delphi 6位图修改代码可以用SIMD或其他方法加速吗?,performance,delphi,optimization,bitmap,simd,Performance,Delphi,Optimization,Bitmap,Simd,我有一个Delphi6应用程序,可以实时修改位图。目前,我正在使用下面显示的代码来快速提高亮度和对比度。如果操作只是一个加法或乘法,我可以看到如何使用SIMD,但由于加法和乘法都涉及,而且还有Trunc()操作将其限制在一个字节的范围内,我不确定这里是否可以使用SIMD。以下是我的问题: SIMD可以用于此代码吗?您知道我可以使用的好代码示例吗?我能期待什么样的提速 扫描线的(潜在)填充是否有问题 有关于加速代码的一般优化提示吗 ) 当然,SSE或MMX是可能的 然而,在您的情况下,如果您使用您
当然,SSE或MMX是可能的 然而,在您的情况下,如果您使用您的方程式预计算256个条目的表,您可能会获得几乎相同的速度提升
然后用简单的表格查找替换所有计算。我的最佳选择是,在现代处理器上,这将提供与MMX/SSE几乎相同的速度。使用整数运算不是更好吗?@DavidHeffernan。说得好。我将重铸压缩比,并将值转换为整数,看看我得到了什么样的速度提升,因为就用户的感知而言,我可能不会失去任何明显的逼真度。谢谢。我考虑了一下,想确定我理解你的意思。要完全预计算一个表,如果我将compressionRatio和shiftValue重铸为Byte,并通过(p0^,compressionRatio,shiftValue)索引该表,则需要一个大小为256立方或16777216字节的三维表,该表相当大。或者您是在指示另一种表示法吗?不,这个想法是在循环外计算表pixels@RobertOschler,只需预先计算乘法即可开始。这将消除每像素3次乘法和3次代价高昂的Trunc()。我怀疑预先计算添加shiftVal会为您节省很多。
// 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;