【问题标题】:SSE optimized code performs similar to plain versionSSE 优化代码执行类似于普通版本
【发布时间】:2011-10-24 05:58:20
【问题描述】:

我想在英特尔的 SSE 上迈出第一步,所以我按照发布的指南 here 987654322@ 但posix_memalign)。

我还在不使用 SSE 扩展的情况下实现了一种计算密集型方法。令人惊讶的是,当我运行程序时,两段代码(带有 SSE 和没有 SSE 的一段)都需要相似的时间来运行,通常是使用 SSE 的时间略高于另一段。

这正常吗? GCC 是否可能已经使用 SSE 进行了优化(也使用 -O0 选项)?我也试过-mfpmath=387选项,但没办法,还是一样。

【问题讨论】:

  • 你用的是什么CPU?
  • 我使用的是 Intel Core i7 M640 2.80GHz
  • 好的 - 请参阅下面的答案,您可能还想发布您的代码和用于构建它的命令行。

标签: c gcc x86 sse simd


【解决方案1】:

对于浮点运算,您可能看不到 SSE 的巨大优势。大多数现代 x86 CPU 都有两个 FPU,因此双精度对于 SIMD 与标量的速度可能只有大约相同的速度,而单精度可能会给您带来 2 倍的 SIMD 比标量在好的一天。但是对于整数运算,例如8 位或 16 位的图像或音频处理,您仍然可以通过 SSE 获得显着优势。

【讨论】:

  • 这可能是原因。我会尝试单精度版本。
  • OK - 将代码和命令行也添加到您的问题中 - 有很多简单的事情在开始使用 SIMD 时可能会出错。
  • 你说得对,Paul R。使用 32 位整数的版本的速度提高了大约 2 倍。我想在 16 位和 8 位操作中,好处会更好。顺便说一句,我删除了整数版本中的平方根运算。非常感谢。
【解决方案2】:

GCC 有一个非常好的内置代码矢量化器(iirc 在 -O0 及以上启动),因此这意味着它将在任何地方使用 SIMD 以加速标量代码(它还将优化 SIMD如果可能的话,也写一点代码。

很容易确认这确实是这里发生的事情,只需反汇编输出(或让 gcc 发出带注释的 asm 文件)。

【讨论】:

  • 我检查了汇编代码,我只看到了我期望从具有显式(至少)SSE 的代码中得到的一对 addps 指令。
  • 我怀疑自动矢量化是否会在 O0 时发挥作用(无优化),因为它是一个非常繁重的优化,应该只在 O2 或 O3 时发挥作用。
  • 如果您查看 gcc 手册页,它会说 -ftree-vectorize-O3 设置。那是在 Debian/Ubuntu 上,在其他平台上可能会有所不同。小心,-O0 是 0 优化。优化开始于-O1
猜你喜欢
  • 2011-12-09
  • 2011-12-16
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多