0

我的教授发现了这个使用 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。这种情况一直都在发生!

任何建议都会很棒。

谢谢,萨扬

4

2 回答 2

2

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

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

于 2010-04-12T16:44:32.623 回答
0

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

于 2010-04-14T17:19:11.847 回答