C# 磨削次数的优化

C# 磨削次数的优化,c#,math,optimization,micro-optimization,C#,Math,Optimization,Micro Optimization,长话短说,我必须在迭代过程中求解20..200个块三对角线性系统。系统的大小为50..100块,每个块为50..100 x 50..100。我将在这里写下我对此事的看法,我请你们分享你们对我想法的看法,因为我可能在某一方面错了 为了解这些方程,我使用了Thomas算法的矩阵版本。它完全像标量1,除了方程中的标量系数之外,我有矩阵(也就是说,代替“a_i x_{i-1}+b_i x_i+c_i x_{i+1}=f_i”,其中a_i,b_i,c_i-矩阵;f_i和x_i是向量 该算法的渐近复杂度为O

长话短说,我必须在迭代过程中求解20..200个块三对角线性系统。系统的大小为50..100块,每个块为50..100 x 50..100。我将在这里写下我对此事的看法,我请你们分享你们对我想法的看法,因为我可能在某一方面错了

为了解这些方程,我使用了Thomas算法的矩阵版本。它完全像标量1,除了方程中的标量系数之外,我有矩阵(也就是说,代替“a_i x_{i-1}+b_i x_i+c_i x_{i+1}=f_i”,其中a_i,b_i,c_i-矩阵;f_i和x_i是向量

该算法的渐近复杂度为O(N*M^3),其中N是以块为单位的整体矩阵的大小,M是每个块的大小

现在我的瓶颈是反演运算。在嵌套循环的深处,我必须计算很多类似于“(c_i-a_i*alpha_i)^-1”的反演,其中alpha_i是一个稠密的MxM矩阵。我使用Gauss-Jordan算法,使用额外的内存(我以后在程序中必须使用)和O(M^3)运算

为了找到关于如何优化反演操作的信息,我只找到了关于“规范地”求解AX=B系统的线程,即X=A^-1B,并建议使用LU分解来代替它。遗憾的是,由于我的反演是Thomas算法的一部分,如果我诉诸LU分解,我将不得不对M*NxM*N矩阵进行求解,这将提高效率求解线性系统的复杂度增加了N^2到O(N^3*M^3)。这会降低2500..10000倍,这是非常糟糕的

近似或迭代反演也不在范围之内,因为精确反演的最微小残余将快速累积,并导致全局迭代过程爆发

我用parallel.For()并行计算,分别求解20..200个系统

目前,要解决20个N、M=50的此类系统,平均需要872ms(i7-3630QM,2.4Ghz,4个核心(8个具有超线程)

最后,问题来了

  • 我在这里写的对吗?有没有一种算法可以大大加快计算速度

  • 我的程序中的数字研磨机内部部分仅用于循环(大多数循环的边界都是常数的,反转算法内部的一个循环除外)、双算术(+、-、*、/)和标准数组([]、[、]、[、]、[、])。如果我将此部分重写为不安全的,或者作为C中的库,会有任何加速吗

  • 这种任务(双数组研磨)的C#开销是多少?C编译器在优化如此简单的代码方面是否比C#“编译器”更好

  • 在C#中优化numbergrinder时,我应该看什么?它是否适合这样的任务


  • 我已将标签从标题中删除。您可以阅读标题中不需要标签的原因。