【问题标题】:Optimization of a c++ matrix/bitmap classc++矩阵/位图类的优化
【发布时间】:2010-05-21 14:12:28
【问题描述】:

我正在搜索一个 2D 矩阵(或位图)类,它既灵活又能快速访问元素。内容 一个灵活的类应该允许您在运行时选择维度,并且看起来像这样(简化):

class Matrix 
{
public:   
  Matrix(int w, int h) :  
    data(new int[x*y]), width(w)  {}

 void SetElement(int x, int y, int val)  
 {  
   data[x+y*width] = val;  
 } 

 // ...
private: // symbols
  int width;  
  int* data;  
};

使用模板的更快的经常提出的解决方案是(简化的):

template <int W, int H>
class TMatrix {
  TMatrix() data(new int[W*H])  {}

  void SetElement(int x, int y, int val)  
  {  
    data[x+y*W] = val;  
  } 

  private:
    int* data;
};

这更快,因为宽度可以在代码中“内联”。第一个解决方案不这样做。但是,这不再很灵活,因为您无法在运行时再更改大小。

所以我的问题是: 是否有可能告诉编译器生成更快的代码(例如使用模板解决方案时),当代码中的大小是固定的并在其运行时依赖时生成灵活的代码?

我试图通过尽可能写“const”来实现这一点。我用 gcc 和 VS2005 尝试过,但没有成功。这种优化对于许多其他类似情况很有用。

【问题讨论】:

  • “这种优化对于许多其他类似情况很有用。”你是根据实际测试说的,还是只是你的信念?请记住,过早优化等等。
  • 你分析过这段代码吗?对于任何未嵌入的东西,额外的乘法和加法甚至不太可能出现在 perf 中。在许多使用硬件矢量数学支持和/或批量复制值而不是一次复制一个值的平台上,这比试图摆脱两个标量操作更能赢得您的青睐。

标签: c++ optimization templates matrix bitmap


【解决方案1】:

我自己会选择第一个版本。

但是,如果你真的想要两全其美,你可以有一个 Matrix 类,它包含一个指向多态实现类型的指针。对于常见尺寸(比如最大 4x4),您可以指向模板实例化,对于更大的尺寸,您可以指向处理一般 MxN 情况的实现。

说了这么多,我认为所有间接调用和虚拟调用都会抵消模板可能带来的任何性能改进。在这种情况下,我认为你不能吃蛋糕也不能吃。

如果您总是处理在编译时已知大小的数据(例如图形/几何矢量),则最好使用模板版本(可能以静态大小存储数据(非堆分配)数组)。如果您需要针对任意数据的通用功能,请改用动态版本。

【讨论】:

    【解决方案2】:

    当然,您的需求可能会有所不同,但我会跳过自动生成,而只使用一组简单而简单的“固定”版本。例如。 Vector3、Vector4、Matrix3x3、Matrix3x4 和 Matrix4x4。我想您可以从模板版本中派生所有这些,但不会产生任何特定的性能差异。

    您是否有任何特殊原因希望能够在运行时更改尺寸?因为我建议,对于需要进行更改的(我怀疑很少见的)实例而言,仅从一个复制到另一个不会非常昂贵。

    最后,我看到的做法是对命名元素访问以及数组进行访问,但您只能使用“硬编码”类型来做到这一点。比如:

    class Vector3
    {
    public:
       // other stuff...
    
       union
       {
          struct { float x, y, z; };
          float m[3];
       };
    };
    

    (这可能不是完全合法的 C++,修改以适合您的编译器。)

    哦,即使是模板版本也不需要使用new。只需将数据声明为 float data[W*H]; 将其从堆中取出将比“优化”一些数学运算带来更大的性能提升。

    【讨论】:

      【解决方案3】:

      不是一个完整的答案,而是一些可能有帮助的信息(如果你还没有意识到这些):OpenCVBoost (uBLAS) 都非常好(快速/完整/full-featured) 矩阵实现。不过,我没有在它们内部查看它们是如何设置/获取元素或在实例化后调整大小的。

      【讨论】:

        猜你喜欢
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多