【问题标题】:OpenMP + SSE gives no speedupOpenMP + SSE 没有加速
【发布时间】:2010-04-12 15:12:23
【问题描述】:

我的教授发现了这个使用 SSE 和 OpenMP 进行 3D 线性可分内核卷积的有趣实验,并交给我对我们系统的统计数据进行基准测试的任务。作者声称串行方法的速度提高了 18 倍!可能并非总是如此,但我们预计在双核 Intel 上运行它至少可以加快 2-4 倍。

http://software.intel.com/en-us/articles/16bit-3d-convolution-sse4openmp-implementation-on-penryn-cpu/#comment-41994

唉,我们找不到任何加速。无论有没有 OpenMP,串行代码的性能总是更好。

我正在使用Linux,并观察到某种趋势...当系统上没有其他进程正在运行时,一段时间后loadavg开始增加,并且%CPU利用率下降。

我意外遇到的另一个可能的误报...我启动了程序,然后立即暂停了它。然后我用 bg 在后台运行它,发现加速比超过 2。这种情况一直都在发生!

任何建议都会很棒。

谢谢, 萨彦

【问题讨论】:

  • 你确定你的cpu速度是瓶颈吗?
  • 很抱歉排除了一个重要部分。我只是向程序发送两件事,XYZSize 和程序应该运行的次数。因此,在具有 4 GB RAM 的双核上,如果我将 1024X1024x1024 传递给整数值,则满足 4GB 的限制。可能这就是为什么 %CPU 下降和 loadavg 增加会发生奇怪的事情的原因。但即使对于较小的值,如 16、32、64 或 256(程序接受 XYZSize 为 8 的倍数),也绝对没有加速。

标签: openmp sse convolution


【解决方案1】:

您确实需要分析您的程序以确定瓶颈。您还需要以更“全面”的方式看待优化。您的性能问题可能与糟糕的设计、糟糕的编码、内存带宽限制以及许多其他问题有关,这些问题都无法通过微优化(例如使用 SIMD 代替标量代码)来解决。

从个人资料开始(为此使用Zoom 之类的工具)并从那里开始工作。

【讨论】:

    【解决方案2】:

    好吧,我摸索了一下,然后尝试了以下方法:我使用 -O0 选项(没有优化)编译了程序,几乎所有 XYZ 值都获得了 2 的加速比。我还可以看到我的双核上使用了 2 个线程(以前,它只使用一个)。 但是现在,当我删除 OpenMP 编译指示时,我看不到加速,这让我很困扰,因为 SSE 应该能够大大加快速度。所以这种加速可能完全归功于 OpenMP,必须找出 SSE 失败的原因。有人告诉我,如果操作是微不足道的(也许这个词的重要性是有争议的,因为它因人而异),使用 SSE 不会获得加速。但是我写了一个小程序,计算 i_max_size = 64000 的 sqrt(i)/i ......并且 SSE 版本的加速比为 3.5 ~ 4.0。 一旦找到根本原因,我会发布更多内容。

    【讨论】:

    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 2017-08-11
    • 2012-11-13
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多