代码之家  ›  专栏  ›  技术社区  ›  Thomas

定点算术值我的麻烦吗?

  •  12
  • Thomas  · 技术社区  · 14 年前

    我正在研究一个应该实时运行的流体动力学Navier-Stokes解算器。因此,性能很重要。

    现在,我将看到许多紧密循环,每个循环占执行时间的很大一部分:没有单个瓶颈。这些循环中的大多数都执行一些浮点运算,但是在这两者之间有很多分支。

    浮点运算主要限于加法、减法、乘法、除法和比较。所有这些都是使用32位浮点来完成的。我的目标平台是x86,至少有SSE1指令。(我已经在汇编程序输出中验证了编译器确实生成了SSE指令。)

    我使用的大多数浮点值都有一个相当小的上界,而精确到接近零的值并不重要。所以我想到:也许切换到定点算术可以加快速度?我知道唯一能确定的方法是测量它,这可能需要几天时间,所以我想提前知道成功的几率。

    定点是所有的愤怒在末日的日子,但我不确定它的立场安诺2010年。考虑到现在有多少硅被注入到浮点性能中,固定点算法是否仍有可能显著提高速度?有没有人有任何实际经验可以适用于我的情况?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community Dai    7 年前

    正如其他人所说,如果您已经在使用浮点SIMD,我怀疑您在固定点方面会有很大的改进。

    您说过编译器正在发出SSE指令,但听起来不像您试图编写向量化的SSE代码。我不知道编译器通常在这方面有多好,但这是需要调查的。

    其他两个方面是:

    1. 内存访问 -如果您的所有计算都是在SSE中完成的,那么缓存未命中可能会占用比实际计算更多的时间。

      1. 您可以使用诸如_mm_prefetch或_uu builtin_prefetch(取决于您的编译器/平台)预取数据。
      2. 检查昂贵的函数是否在输入和输出之间存在混叠;这可能导致额外的内存读/写。
      3. 考虑以不同的方式存储数据-如果您的流体解算器解算X坐标(与Y坐标无关),则将它们存储在不同的数组中可能更易于缓存。如果它们一起解决,请考虑交错(例如x y x y…)
    2. 展开 -您应该能够从展开内部循环中获得性能优势。目标不是(像许多人认为的那样)减少循环终止检查的数量。主要好处是允许独立指令交错,隐藏指令延迟。有一个演示 here 有资格的 VMX优化:提升一个级别 这可能会有点帮助;它关注的是Xbox360上的Altivec指令,但一些展开的建议也可能有助于SSE。

    正如其他人提到的,配置文件、配置文件、配置文件。然后让我们知道还有什么慢:)

    PS-在你的另一个帖子上 here 我说服你在矩阵解算器中使用sor而不是gauss-seidel。现在我想起来了,你不使用三对角解算器有什么原因吗?

        2
  •  6
  •   Paul R    14 年前

    用浮点数固定。只有在8位或16位内工作并使用SIMD(图像处理和音频是这方面的典型用例)时,定点才真正有用。

    现代CPU通常有2个FPU,每个时钟周期最多可以发出2个FP指令。然后,您还可以使用4路FP SIMD(SSE)进行优化。

    如果您仍在努力获得良好的性能,那么请尝试使用更好的编译器,如Intel的ICC。此外,64位的Intel可执行文件往往比32位的对应文件快一些,这是因为64位模型中寄存器的数量增加了,所以如果可以的话,可以构建64位。

    当然,您也应该对代码进行概要分析,以便确定热点在哪里。你不用说你在用什么操作系统,但是 VTune 在Windows上, Zoom 在Linux上 Shark 在Mac OS X上,所有这些都将帮助您快速轻松地找到性能瓶颈。

        3
  •  0
  •   Mike Dunlavey    14 年前

    您的机器已经很好地针对浮点进行了优化,所以通过定点分数可能不会节省太多。

    你说没有单一的瓶颈,但可能有多个瓶颈,如果你设法剃掉其中的任何一个,那么其他人将占用更多的剩余时间,吸引你的注意力,所以你也可以剃掉它们。

    您可能已经完成了这项工作,但我要确保不仅耗时的函数尽可能快,而且它们被调用的次数也不超过必需的次数。