“分支预测”与高级语言中的马尔可夫链

时间:2015-03-23 05:01:36

标签: python performance matlab markov-chains branch-prediction

一些函数使用分支预测系统,该系统允许对某些数据结构进行更快的计算,例如,在包含if语句函数的循环中使用排序数据比处理更快,而数据未排序(有关分支预测的更多信息,请参阅以下精彩文章:Why is it faster to process a sorted array than an unsorted array?)。

我的问题很简单:是高级编程语言,如C,Python,MATLAB,R等,使用马尔可夫链预测来提高某些计算的速度?

我不是专家,我刚刚开始学习马尔可夫链,但在我看来,每个代码,主要是包含循环的代码,都有某种时间上可预测的随机事件,可以用来加速计算。

示例将是应用于包含1到200之间的整数的矩阵的函数,其中90%的值低于100,即2位数。它似乎是自动"预分配"基于具有x或y数字整数的概率的一定数量的比特可以提高性能。

分支预测的工作原理是什么?这是否延伸到任何计算?

1 个答案:

答案 0 :(得分:1)

关于BigInteger

理论上,如果计算整数乘法实际上是位大小的递增函数,那是正确的。也就是说,如果使用if语句将整数乘法实现为循环。但是,32位整数的计算将是相同的'由于它们将使用硬件中实现的相同加法器门,因此在当前的64位CPU上成本为16位整数或64位整数。在Performance 32 bit vs. 64 bit arithmetic

中可以找到更复杂的讨论

相反,如果您手动执行此操作,则会产生额外的开销成本,试图实际存储这些部分大小的值(例如位域,位向量)。

现在我们说我们正在谈论非常大的整数,想想java.math.BigInteger。那么你说你可以通过预先分配所述位数而不是从1个单位('数字')开始并创建新的'数字来获得性能优势是正确的。当你执行操作时。只需看看OpenJDK Implementation of BigInteger.multiply()即可。这正是他们在multiply方法中所做的。在某些方面,这个想法也与Pre-allocation performance tip for MATLAB有关。当您可以轻松地预分配数组时,不要在OutOfBounds上进行不必要的分支。

实践

现在直接回答你的语言是否利用马尔可夫链的问题,我相信不是。没有语言来源我曾经见过(或引擎,就此而言)维持一个真正的马尔可夫链。大多数高级语言在其上下文中都是通用的,因此对状态的预测会给任何类型的计算增加相当大的开销。回到java.math.BigInteger示例,分配数字总和几乎总是比使用存储状态的预测机制更快。它可能会在结果中节省内存,但它对性能有害。 CPU本身依赖于状态机(可以被认为是马尔可夫链)来执行预测优化,但这是因为它可以承受而没有明显的成本损失(参见wiki on branch prediction或{{3}中的示例})。

话虽这么说,时间上可预测的事件的想法是改善整体表现的关键,并且要被利用;它不仅限于分支预测。数据组织对性能至关重要。示例包括java hardware array prefetchingGenerational Garbage Collection in .NETEfficient Management of Particles in Particle FX。最后一个实际上利用马尔可夫预测器来确定哪个页面作为用户日志的函数预取到高速缓存中。在智能数据组织的游戏引擎和运行时实现中可以找到许多其他示例,以便击败分支预测或者只是完全跳过它!

tldr;

在实际开发中,大多数优化依赖于对数据进行简化假设,而不是应用马尔可夫预测器。因此,如果您希望利用分支预测,请了解您的数据并妥善组织。这将改善您的预测,或允许您完全跳过它。使用预测器可能会在开发和执行时间上花费更多。如果您仍然觉得预测器可能会有所帮助,请维护一个简单的状态机并将其与天真的解决方案进行对比。