2010-04-12 94 views
0

我的教授发现了使用SSE和OpenMP的3D线性可分内核卷积这个有趣的实验,并给我任务来对我们系统的统计进行基准测试。作者声称从系列方法出现18倍的疯狂加速!可能并不总是这样,但我们期望在双核英特尔上至少有2-4倍的加速比。OpenMP + SSE不加速

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

唉,我们可以准确地找到没有加速。无论使用或不使用OpenMP,串行代码始终性能更好。

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

另一个可能的误报,我偶然遇到了......我启动了程序,然后立即暂停了它。然后我用bg在背景上运行它,并看到超过2的加速。这种情况一直发生!

任何建议将是伟大的。

感谢, 萨扬

+2

你确定你的CPU速度是瓶颈吗? – Mene 2010-04-12 15:46:43

+1

抱歉排除一个重要部分。我只是发送程序两件事,XYZSize和程序运行的次数。因此,在具有4 GB RAM的双核上,如果我通过1024X1024x1024的整数值,则会达到4GB的限制。也许这就是奇怪的事情发生在%CPU下降和loadavg增加的原因。但即使对于较小的值,例如16,32,64或256(程序接受XYZSize的倍数为8),也绝对不会加速。 – 2010-04-12 23:46:05

回答

2

你真的需要配置您的计划,以找出问题所在。您还需要以更“整体”的方式来看待优化。您的性能问题可能与糟糕的设计,糟糕的编码,内存带宽限制以及其他许多问题有关,其中没有一个问题会通过微型优化解决,如使用SIMD代替标量代码。

从配置文件开始(使用像Zoom这样的工具)并从那里开始工作。

0

那么我摸索了一下,然后尝试了以下内容:我使用-O0选项编译程序(无优化),几乎为所有XYZ值加快了2。我还可以看到,我的双核上使用了2个线程(以前,它只使用一个)。 但是现在,当我删除OpenMP Pragma时,我看不到加速,这让我困扰,因为SSE应该能够大幅度提高速度。所以这种加速可能完全归功于OpenMP,必须找出SSE失败的原因。有人告诉我,如果行动微不足道(也许这个词提出的权重是有争议的,因为它在人与人之间是不同的),使用SSE获得者不会加速。但我写了一个小程序,计算sqrt(i)/ i为i_max_size = 64000 .....,SSE版本的加速比为3.5〜4.0。 一旦找到根本原因,我会发布更多信息。

+0

那么我有点理由。有一个编译器开关-fmpmath = unit决定浮点计算是否会转换为sse或i387。对于x86机器,它默认为sse。 http://gcc.gnu.org/ml/gcc-patches/2004-11/msg02119.html – 2010-04-14 20:33:39