【问题标题】:Why Bresenham's line algorithm more efficent then Naive algorithm为什么 Bresenham 的线算法比 Naive 算法更高效
【发布时间】:2011-12-28 04:43:11
【问题描述】:

在我的图形课程中,我们学习了 Naive 线条光栅化算法,然后是 Bresenham 的线条绘制算法。我们被告知计算机是整数机器,这就是我们应该使用后者的原因。

  1. 如果我们假设没有软件级别的优化,对于具有 mmx 和其他指令集的现代 cpu 来说是否如此?正如我查看 Intel 的 64-ia-32-architectures-optimization-manual.pdf 一样,与 mmx 的 int 相比,float 的加减乘法延迟相同或更好。

  2. 如果算法在 gpu 中执行,这应该有问题吗?如已检查NVIDIA CUDA Programming Guide 1.0 (pdf),第 41 页,int 和 float 的时钟周期是相同的。

  3. 将 float 转换为 int 的低效率是什么? load-hit-store 停顿对我们来说是一个真正的问题吗?

  4. 向上/向下舍入数字的函数的效率如何? (我们可以想到c++ stl中的实现)

  5. Bresenham 算法获得的效率是由于内循环中使用的加法而不是乘法吗?

【问题讨论】:

    标签: performance floating-point int rasterizing bresenham


    【解决方案1】:

    将计算机称为整数机有点误导,但这种观点大多是正确的。据我所知,CPU 使用整数寄存器来生成要读取和写入的内存地址。将线条绘制保存在整数寄存器中意味着您可以避免从其他寄存器复制到整数寄存器以生成内存地址以在线条绘制期间写入像素的开销。

    至于你的具体问题:

    1. 由于您需要使用通用寄存器来访问内存,因此使用 SSE 或 FPU 计算内存偏移量(指针)仍然会产生将数据从这些寄存器传输到通用寄存器的开销。因此,这取决于从一个寄存器集传输到另一个寄存器集的开销是否大于使用特定指令集的性能。
    2. GPU 往往具有统一的寄存器集,因此它应该没有那么重要。
    3. 将浮点数转换为 int 本身并不昂贵。开销来自将数据从一个寄存器组传输到另一个寄存器组。通常这必须通过内存来完成,如果你的 CPU 有 load-hit-store 惩罚,那么这种传输就是它们的一个重要来源。
    4. 向上或向下舍入的性能取决于 CPU 和编译器。在慢端,MSVC 曾经使用一个函数来舍入到零,这与 FPU 控制字混淆。在快速端,您有直接处理舍入的特殊 CPU 指令。
    5. Bresenham 的线条绘制算法速度很快,因为它减少了从简单的y= m*x + b 公式确定在线上绘制点的位置到一个加法加上一个分支(并且可以通过众所周知的无分支整数技术消除分支)。 Brensenham 的线条绘制算法的运行切片版本可以更快,因为它直接确定具有相同组件的像素“运行”而不是迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多