2011-12-28 66 views
2

对于我的显卡当然,我们被教导朴素线光栅化算法然后布氏画线算法Bresenham直线算法比较有效,然后天真算法。我们被告知计算机是整数机器,这就是为什么我们应该使用后者。为什么

  1. 如果我们假设没有对软件层进行优化,那么对于带有mmx和其他指令集的现代cpus来说,这是真的吗?正如我已经看过英特尔的64-ia-32-architectures-optimization-manual.pdf和加法减法乘法的延迟对于浮点而言是相同或更好的,而对于mmx来说则是int。

  2. 如果该算法在GPU应该此事执行?当检查NVIDIA CUDA Programming Guide 1.0 (pdf)(第41页)时,int和float的时钟周期是相同的。

  3. 什么是铸造浮动为int的脱效率?是负载冲击 - 商店失速对我们来说是一个真正的问题?

  4. 效率如何是这轮向上/向下数的功能呢? (我们可以想到在C++ stl中的实现)

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

回答

2

调用计算机整数机器有点误导性,但情绪大多属实。由于据我所知,CPU使用整数寄存器来生成内存地址来读取和写入。在整数寄存器中保留线绘图意味着您可以避免从其他寄存器复制到整数寄存器以产生在绘制线期间写入像素的内存地址的开销。

至于你具体的问题:

  1. 既然你需要使用通用寄存器来访问内存,采用SSE或FPU计算内存偏移量(指针)仍将具有传输数据的开销那些注册到通用目录。所以这取决于从一个寄存器组转换到另一个寄存器组的开销是否大于使用特定指令集的性能。
  2. 的GPU往往有一个统一的寄存器组,因此它不应该事几乎一样多。
  3. 将一个float转换为一个int本身并不昂贵。开销来自将数据从一个寄存器组传输到另一个寄存器组。通常这是通过内存完成的,如果你的CPU有加载存储惩罚,这个转移是他们的一个重要来源。
  4. 向上或向下舍入的性能取决于CPU和编译器。在缓慢的一端,MSVC曾经使用一个函数来舍入到零,这与FPU控制字分离。在快速的一端,你有特殊的CPU指令,直接处理四舍五入。
  5. 布氏线描算法快速,因为它减少确定在何处上的线画点从幼稚y= m*x + b式给加法加上一个分支转移(和分支可以消除通过众所周知的网点整数技术)。 Brensenham的线条绘制算法的运行切片版本可以更快,因为它直接确定具有相同分量的像素的“运行”,而不是迭代。