我在GF(2)上实现了高斯消元法。我使用二维64位Integer-Array以行为主的表示形式存储Matrix (矩阵的行存储在连续的数组中)。我在矩阵的行上实现了高斯消元,方法如下:
其中( A )^i表示A的第i行。然后我意识到,如果我像下面这样在第5-6行拆分循环,我会获得略好的性能:
我希望得到稍微差一点的性能,因为我再次迭代了整个外部循环…有人对这种行为有什么解释吗?编译器是否在做一些棘手的优化工作,这更容易在拆分的变量上执行?(用g++ -O3编译)
(如果伪代码不能得到答案,我可以提供一个最小的代码示例)
发布于 2016-07-25 18:50:06
没有理由期望第二个解决方案的性能会更差--两种算法都在
,它们甚至有相同的常量:在第一个解决方案中,您的外部循环在
,在第二个中,你有两个循环
。
在实践中,您的第二个解决方案可能具有更好的CPU缓存特性,或者更适合于编译器优化。特别是,由于您的操作是在GF(2) / Z(2)上进行的,它们可以表示为单词上的二进制操作-这将导致很大的加速。根据您的实现(以及对n的约束),算法可能会优化为
最后。但是,如果不看一下您的代码,我们就无法真正判断:)。
https://stackoverflow.com/questions/38563860
复制相似问题