具有潜在性能优化的浮点算法

时间:2014-03-02 15:28:12

标签: performance algorithm optimization floating-point micro-optimization

对于大学讲座,我正在寻找具有已知渐近运行时的浮点算法,但是可以进行低级(微)优化。这意味着优化,例如最小化缓存未命中和寄存器溢出,最大化指令级并行性以及利用新CPU上的SIMD(向量)指令。优化将是特定于CPU的,并将使用适用的指令集扩展。

经典教科书的例子是矩阵乘法,通过简单地重新排序内存访问序列(以及其他技巧)可以实现极大的加速。另一个例子是FFT。不幸的是,我不允许选择其中任何一种。

任何人都有任何想法,或者可以使用提升的算法/方法吗?

我只对可以想象每线程加速的算法感兴趣。通过多线程并行解决问题很好,但不是本讲座的范围。

编辑1:我参加课程,而不是教授课程。在过去几年中,有不少项目在性能方面成功超越了当前最佳实施。

编辑2:这个paper列表(从第11页起)七类重要的数值方法和一些使用它们的相关算法。至少有一些提到的算法是候选者,但是很难看出哪个算法。


编辑3:谢谢大家的好建议!我们建议实施曝光融合算法(paper from 2007),我们的提案已被接受。该算法创建类似HDR的图像,主要包括小核卷积,然后是源图像的加权多分辨率混合(在拉普拉斯金字塔上)。我们感兴趣的是,该算法已经在广泛使用的Enfuse工具中实现,该工具现在版本为4.1。因此,我们将能够验证和比较我们的结果与原始结果,也可能有助于工具本身的开发。如果可以的话,我将在未来更新这篇文章。

3 个答案:

答案 0 :(得分:6)

最简单的例子:

  • 总和。使用多个累加器和矢量化展开允许在典型的流水线架构上加速(ADD延迟)*(SIMD矢量宽度)(如果数据在缓存中;因为没有数据重用,如果您正在读取数据,它通常无济于事记忆),很容易就是一个数量级。可爱的事情要注意:这也会降低结果的平均误差!相同的技术适用于任何类似的减少操作。

一些来自图像/信号处理的经典作品:

  • 小内核的卷积(特别是小的2d卷积,如3x3或5x5内核)。在某种意义上,这是作弊,因为卷积矩阵乘法,并且与FFT密切相关,但实际上,高性能小内核卷积的细节算法技术与两者完全不同。

  • 腐蚀和扩张。

  • 人们称之为“伽马校正”的形象;这实际上是对指数函数的评估(可能是零线性段接近零)。在这里你可以利用这样的事实:图像数据通常完全处于一个很好的有界范围,如[0,1],并且使用更便宜的函数近似很少需要sub-ulp精度(低阶分段minimax多项式是常见的)。

答案 1 :(得分:1)

Stephen Canon的图像处理示例将分别用于指导性项目。但是,采取不同的方法,你可能会看到某些适合的几何问题:

  • 中等高度的最近一对点 - 比如大约16个维度中的50000左右。对于您的目的,这可能与矩阵乘法有太多共同之处。 (将维度提高得太高,维数降低愚蠢开始重要;低得多且空间数据结构占主导地位。使用蛮力内核的蛮力或简单的东西,是我想要用于此目的。)
  • 变化:对于每个点,找到最近的邻居。
  • 变化:红点和蓝点;找到每个蓝点最近的红点。
  • Welzl最小的包含圆算法实现相当简单,而且真正昂贵的步骤(检查当前圆之外的点)是否适合矢量化。 (我怀疑你可以通过一点点努力在两个方面杀死它。)

请注意,计算几何体的实现通常比它最初看起来更烦人;不要只是抓住一篇随机论文而不了解存在哪些退化案例以及你的编程需要多么谨慎。

也要看看其他线性代数问题。它们也非常重要。密集的Cholesky因子分解在这里是很自然的事情(远比LU因子化更重要),因为你不需要使用旋转来使其工作。

答案 2 :(得分:1)

有一个名为c-ray的免费基准。 它是一种用于球体的小型射线追踪器,旨在成为浮点性能的基准。

一些随机的叠加照片显示,它几乎所有时间都在一个名为ray_sphere的函数中,它确定一条光线是否与一个球体相交,如果是,则在哪里。

他们还展示了一些更大的加速机会,例如:

  • 它会对场景中的所有球体进行线性搜索,以尝试找到最近的交点。在进行所有三维几何数学运算之前,通过快速测试来确定球体是否比目前最好看的球体更远,这代表了加速的可能区域。

  • 它不会尝试利用从一个像素到下一个像素的相似性。这可以获得巨大的加速。

因此,如果你想看的只是芯片级性能,它可能是一个不错的例子。 然而,它也显示了如何有更大的机会。