什么算法有很高的时间复杂度,以帮助“燃烧”更多的CPU周期?

时间:2012-01-23 22:10:19

标签: algorithm complexity-theory time-complexity

我正在尝试为嵌入式处理器编写演示,这是一种多核架构,并且在浮点计算方面非常快。问题是我当前的硬件是通过评估板连接的处理器,其中DRAM到芯片速率有些限制,并且板到PC速率非常慢且效率低。

因此,在演示大矩阵乘法时,我可以在几毫秒内完成128x128矩阵,但I / O需要(很多)秒才能完成演示。

所以,我正在寻找某种比n ^ 3更高复杂度的计算,越多越好(但最好是易于编程和解释/理解)使计算部分在时间预算中更占优势,其中数据集最好绑定到每个线程(核心)大约16KB。

有什么建议吗?

PS:我认为它本质上与this问题非常相似。

6 个答案:

答案 0 :(得分:3)

您可以生成大(256位)数字并将它们考虑在内;这通常用于“压力测试”工具。如果您特别想要进行浮点计算,可以使用Runge-Kutta积分器构建一个基本的n-body模拟器并运行它。

答案 1 :(得分:1)

你能做的是

  1. 声明一个int
  2. 的std :: vector
  3. 使用N-1填充0
  4. 现在继续反复使用std :: next_permutation直到它们再次排序i..e..next_permutation返回false。
  5. 使用N整数,这需要O(N !)计算,还需要确定性

答案 2 :(得分:1)

PageRank可能非常适合。将其表示为线性代数问题,重复对可控大小的某个浮点矩阵进行正方形直到收敛。在图形隐喻中,一个“涟漪”变化进入每个节点到另一个边缘。两种治疗都可以平行进行。

答案 3 :(得分:1)

你可以做一个最小修剪的正方形。其中一个用途是识别数据集中的异常值。例如,您可以从某些平滑函数(多项式说)生成样本并向某些样本添加(大)噪声,然后问题是找到给定大小的样本的子集H,以最小化其总和残差的平方(对于拟合到H中的样本的多项式)。由于存在大量此类子集,因此您可以做很多事情!有一些近似算法,例如here

答案 4 :(得分:0)

一种方法是在某些M空间(M> 1)中为旅行商问题实施蛮力求解器。

蛮力解决方案是尝试每种可能的排列,然后计算每个排列的总距离,而不进行任何优化(包括没有动态编程技巧,如memoization)。

对于N个点,存在(N!)个排列(冗余因子至少为(N-1),但请记住,没有优化)。每对点需要(M)减法,(M)乘法和一个平方根操作以确定它们的毕达哥拉斯距离。每个排列具有(N-1)个点对以计算并添加到总距离。

因此计算顺序为O(M((N + 1)!)),而存储空间仅为O(N)。

此外,这不应该太难,也不能过于密集以跨核心并行化,尽管它确实需要一些开销。 (如果需要,我可以证明。)

答案 5 :(得分:0)

另一个想法可能是计算分形图。基本上,选择您想要的任何维度的网格。然后,对于每个网格点,执行分形迭代以获取值。有些要点可能只需要几次迭代;我相信有些会永远迭代(混乱;当然,当你有一个有限数量的浮点数时,这不可能真的发生,但仍然)。那些不会阻止你的东西必须在经过一定次数的迭代后“切断”......只需要做到这个非常高的,你应该能够演示一个高质量的分形图。

这样做的另一个好处是网格单元完全独立处理,因此您永远不需要进行通信(即使在模板计算中也不需要进行通信,并且绝对不能像直接N体模拟那样进行O(成对)) 。您可以有用地使用O(gridcells)数量的处理器来并行化这一点,尽管在实践中,您可以通过使用gridcells / factor处理器并在准备好的基础上动态地将网格点调度到处理器来获得更好的利用率。计算基本上都是浮点数学。

Mandelbrot / Julia和Lyupanov作为潜在的候选人浮现在脑海中,但任何人都应该这样做。