计算密集型算法

时间:2011-03-21 07:30:42

标签: algorithm image-processing parallel-processing

我打算在计算密集型算法上编写一堆程序。这些程序将作为不同编译器/硬件性能的指标。

我想要了解一些常用的算法,这些算法用于不同领域,如生物信息学,游戏,图像处理等。我想要这样做的原因是学习算法并拥有一个小的个人迷你基准套装有用的|易于维护。

任何关于算法选择的建议都会非常有用。

4 个答案:

答案 0 :(得分:12)

基准不值得你注意!

最佳指南是处理器性能:http://www.agner.org/optimize/

然后有人会把它放在一个装有3GB RAM的盒子里,打败双通道的希望,你精心调整的基准测试会再次给出截然不同的结果。

如果您有一个性能关键代码,并且您确定已经选择了获胜算法,则无法使用通用基准来确定最佳编译器。您必须使用每个编译器实际编译您的特定代码片段并使用它进行基准测试。你获得的结果虽然对你有用,但不会推断给别人。

举个例子:制作压缩软件的人 - 比如zip和7zip以及PPM和上下文混合等东西 - 都非常注重性能并对程序进行基准测试。他们在www.encode.ru

上闲逛

情况是这样的:对于开发相同基本算法的工程师 - 比如LZ或算术编码和霍夫曼等熵编码 - 工程师都发现非常不同的编译器更好。

也就是说, 两位工程师使用相同的高级算法解决同样的问题,每个工程师都会对他们的实现进行基准测试,并推荐不同编译器的结果 ... < / p>

(我已经看到同样的事情在比赛节目中反复重复,例如Al Zimmermann's Programming Contests,这是一个同样注重表现的社区。)

(较新的GCC 4.x系列全面非常,但这只是我的数据点,其他人仍然偏爱ICC)

(与IO相关的任务的平台基准完全是另一回事;人们不了解Linux,Windows和FreeBSD(以及其他人)在压力下的表现有多么不同。并且那里的基准测试 - 在相同的工作负载,相同的机器上,不同的机器或不同的核心数量 - 将提供非常一般的信息。没有足够的基准测试,可悲的是。)

答案 1 :(得分:4)

几年前,伯克利在这方面做了一些工作。确定了13个并行编程的常用应用程序,即“13个矮人”。包括线性代数,n体模型,FFT等等。

http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-183.html

参见第10页。

这里有一些示例.NET实现:

http://paralleldwarfs.codeplex.com/

答案 2 :(得分:3)

典型的一种是快速傅立叶变换,也许你也可以做一些像Lucas-Lehmer素性测试。

答案 3 :(得分:3)

我记得有一个人通过反转Hilbert矩阵来测试机器的计算性能,编译器版本。

对于图像处理,中值滤波(用于去除噪声,坏像素)总是太慢。考虑到足够大的图像说1000x1000,这可能是一个很好的测试。