Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 这个Delphi 6位图修改代码可以用SIMD或其他方法加速吗?_Performance_Delphi_Optimization_Bitmap_Simd - Fatal编程技术网

Performance 这个Delphi 6位图修改代码可以用SIMD或其他方法加速吗?

Performance 这个Delphi 6位图修改代码可以用SIMD或其他方法加速吗?,performance,delphi,optimization,bitmap,simd,Performance,Delphi,Optimization,Bitmap,Simd,我有一个Delphi6应用程序,可以实时修改位图。目前,我正在使用下面显示的代码来快速提高亮度和对比度。如果操作只是一个加法或乘法,我可以看到如何使用SIMD,但由于加法和乘法都涉及,而且还有Trunc()操作将其限制在一个字节的范围内,我不确定这里是否可以使用SIMD。以下是我的问题: SIMD可以用于此代码吗?您知道我可以使用的好代码示例吗?我能期待什么样的提速 扫描线的(潜在)填充是否有问题 有关于加速代码的一般优化提示吗 ) 当然,SSE或MMX是可能的 然而,在您的情况下,如果您使用您

我有一个Delphi6应用程序,可以实时修改位图。目前,我正在使用下面显示的代码来快速提高亮度和对比度。如果操作只是一个加法或乘法,我可以看到如何使用SIMD,但由于加法和乘法都涉及,而且还有Trunc()操作将其限制在一个字节的范围内,我不确定这里是否可以使用SIMD。以下是我的问题:

  • SIMD可以用于此代码吗?您知道我可以使用的好代码示例吗?我能期待什么样的提速
  • 扫描线的(潜在)填充是否有问题
  • 有关于加速代码的一般优化提示吗
  • )


    当然,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;