5分钟掌握矩阵乘法的Strassen算法

strassen矩阵乘法 java_分治法-Strassen矩阵乘法 算法思想:分治法 实际问题:Strassen 矩阵乘法 编写语言:Java问题描述我们知道,两个大小为 2 * 2 的矩阵相乘,一般需要进行 8 次乘法。而Strassen矩阵乘法可以减少一次乘法,只需要 7 次,看似很少,但当数据量很大时,效率就会有显著提升。不过使用 Strassen矩阵乘法需要满足 矩阵边长为 2 的幂次方。因为该算法会用到分治,如果分治后矩阵两边边长不等,结果会出错。使用下... 阅读详情

By LongLuo

机器学习中需要训练大量数据,涉及大量复杂运算,例如卷积、矩阵等。这些复杂运算不仅多,而且每次计算的数据量很大,如果能针对这些运算进行优化,可以大幅提高性能。

一、矩阵乘法

假设AAA为m×pm \times pm×p的矩阵,BBB为p×np \times np×n的矩阵,那么称m×nm \times nm×n的矩阵CCC为矩阵AAA与BBB的乘积,记作C=ABC = ABC=AB,称为矩阵积(matrix product)。

其中矩阵CCC中的第iii行第jjj列元素可以表示为:

(AB)ij=∑k=1paikbkj=ai1b1j+ai2b2j+⋅⋅⋅+aipbpj (AB)_{ij} = \sum_{k=1}^{p}{a_{ik}b_{kj}} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdot\cdot\cdot + a_{ip}b_{pj} (AB)ij​=k=1∑p​aik​bkj​=ai1​b1j​+ai2​b2j​+⋅⋅⋅+aip​bpj​

如下图所示:

矩阵乘法
假如在矩阵AAA和矩阵BBB中,$m = p = n = N ,那么完成,那么完成,那么完成C=AB$需要多少次乘法呢?

  1. 对于每一个行向量rrr ,总共有NNN行;
  2. 对于每一个列向量ccc,总共有NNN列;
  3. 计算它们的内积,总共有NNN次乘法计算。

综合可以看出,矩阵乘法的算法复杂度是:$\Theta(N^{3}) $。

二、Strassen算法

那么有没有比Θ(N3)\Theta(N^{3})Θ(N3)更快的算法呢?

1969年,Volker Strassen提出了第一个算法时间复杂度低于Θ(N3)\Theta(N^{3})Θ(N3)矩阵乘法算法,算法复杂度为Θ(nlog27)=Θ(n2.807)\Theta(n^{log_{2}^{7}}) = \Theta(n^{2.807})Θ(nlog27​)=Θ(n2.807)。从下图可知,Strassen算法只有在对于维数比较大的矩阵 (N>300N > 300N>300) ,性能上才有很大的优势,可以减少很多乘法计算。

在这里插入图片描述
Strassen算法证明了矩阵乘法存在时间复杂度低于Θ(N3)\Theta(N^{3})Θ(N3)的算法的存在,后续学者不断研究发现新的更快的算法,截止目前时间复杂度最低的矩阵乘法算法是Coppersmith-Winograd方法的一种扩展方法,其算法复杂度为Θ(n2.375)\Theta(n^{2.375})Θ(n2.375)。

三、Strassen原理详解

假设矩阵AAA 和矩阵BBB都是N×N(N=2n)N \times N (N = 2^{n})N×N(N=2n)的方矩阵,求C=ABC = ABC=AB,如下所示:
A=[A11A12A21A22],B=[B11B12B21B22],C=[C11C12C21C22] A = \left [\begin{matrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{matrix} \right ] , B = \left [ \begin{matrix} B_{11} & B_{12} \\ B_{21} & B_{22} \\ \end{matrix} \right ] , C = \left [ \begin{matrix} C_{11} & C_{12} \\ C_{21} & C_{22} \\ \end{matrix} \right ] A=[A11​A21​​A12​A22​​],B=[B11​B21​​B12​B22​​],C=[C11​C21​​C12​C22​​]
其中
[C11C12C21C22]=[A11A12A21A22]⋅[B11B12B21B22] \begin{bmatrix} C_{11} & C_{12} \\C_{21} & C_{22} \end{bmatrix} = \begin{bmatrix} A_{11} & A_{12} \\A_{21} & A_{22} \end{bmatrix} \cdot \begin{bmatrix} B_{11} & B_{12} \\B_{21} & B_{22} \end{bmatrix} [C11​C21​​C12​C22​​]=[A11​A21​​A12​A22​​]⋅[B11​B21​​B12​B22​​]
矩阵 C 可以通过下列公式求出:
C11=A11⋅B11+A12⋅B21C12=A11⋅B12+A22⋅B21C21=A21⋅B11+A22⋅B21C22=A21⋅B12+A22⋅B22 C_{11} = A_{11} \cdot B_{11} + A_{12} \cdot B_{21}\\ C_{12} = A_{11} \cdot B_{12} + A_{22} \cdot B_{21}\\ C_{21} = A_{21} \cdot B_{11} + A_{22} \cdot B_{21}\\ C_{22} = A_{21} \cdot B_{12} + A_{22} \cdot B_{22} C11​=A11​⋅B11​+A12​⋅B21​C12​=A11​⋅B12​+A22​⋅B21​C21​=A21​⋅B11​+A22​⋅B21​C22​=A21​⋅B12​+A22​⋅B22​
从上述公式我们可以得出,计算2个n∗nn * nn∗n的矩阵相乘需要2个n2∗n2\frac{n}{2} * \frac{n}{2}2n​∗2n​的矩阵8次乘法和4次加法。我们使用T(n)T(n)T(n)表示n∗nn*nn∗n矩阵乘法的时间复杂度,那么我们可以根据上面的分解得到下面的递推公式:
T(n)=8∗T(n2)+Θ(n2) T(n) = 8 * T(\frac{n}{2}) + \Theta(n^{2}) T(n)=8∗T(2n​)+Θ(n2)
其中,

  1. 8T(n2)8T(\frac{n}{2})8T(2n​)表示8次矩阵乘法,而且相乘的矩阵规模降到了n2\frac{n}{2}2n​。
  2. Θ(n2)\Theta(n^{2})Θ(n2)表示4次矩阵加法的时间复杂度以及合并矩阵CCC的时间复杂度。

最终可计算得到T(n)=Θ(nlog28)=Θ(n3)T(n)=\Theta(n^{log_{2}^{8}})=\Theta(n^{3})T(n)=Θ(nlog28​)=Θ(n3)。

可以看出每次递归操作都需要8次矩阵相乘,而这正是瓶颈的来源。相比加法,矩阵乘法是非常慢的,于是我们想到能不能减少矩阵相乘的次数呢?

答案是当然可以!!!

Strassen算法正是从这个角度出发,实现了降低算法复杂度!

Strassen实现步骤

实现步骤可以分为以下4步:

  1. 按上述方法将矩阵A,B,CA,B,CA,B,C分解(花费时间$\Theta(1) $。

  2. 如下创建10个n2×n2\frac{n}{2} × \frac{n}{2}2n​×2n​的矩阵S1,S2,...,S10S_1, S_2, ..., S_{10}S1​,S2​,...,S10​(花费时间 $\Theta(n^2) $。
    S1=B12−B22S2=A11+A12S3=A21+A22S4=B21−B11S5=A11+A22S6=B11+B22S7=A12−A22S8=B21+B22S9=A11−A21S10=B11+B12 S_1 = B_{12} - B_{22}\\ S_2 = A_{11} + A_{12}\\S_3 = A_{21} + A_{22}\\S_4 = B_{21} - B_{11}\\S_5 = A_{11} + A_{22}\\S_6 = B_{11} + B_{22}\\S_7 = A_{12} - A_{22}\\S_8 = B_{21} + B_{22}\\S_9 = A_{11} - A_{21}\\S_{10} = B_{11} + B_{12} S1​=B12​−B22​S2​=A11​+A12​S3​=A21​+A22​S4​=B21​−B11​S5​=A11​+A22​S6​=B11​+B22​S7​=A12​−A22​S8​=B21​+B22​S9​=A11​−A21​S10​=B11​+B12​

  3. 递归地计算7个矩阵积P1,P2,...,P7P_1, P_2, ..., P_7P1​,P2​,...,P7​,每个矩阵PiP_iPi​都是 n2×n2\frac{n}{2} × \frac{n}{2}2n​×2n​的。
    P1=A11⋅S1=A11⋅B12−A11⋅B22P2=S2⋅B22=A11⋅B22+A12⋅B22P3=S3⋅B11=A21⋅B11+A22⋅B11P4=A22⋅S4=A22⋅B21−A22⋅B11P5=S5⋅S6=A11⋅B11+A11⋅B22+A22⋅B11+A22⋅B22P6=S7⋅S8=A12⋅B21+A12⋅B22−A22⋅B21−A22⋅B22P7=S9⋅S10=A11⋅B11+A11⋅B12−A21⋅B11−A21⋅B12 P_1 = A_{11} \cdot S_1 = A_{11} \cdot B_{12} - A_{11} \cdot B_{22}\\P_2 = S_2 \cdot B_{22} = A_{11} \cdot B_{22} + A_{12} \cdot B_{22}\\P_3 = S_3 \cdot B_{11} = A_{21} \cdot B_{11} + A_{22} \cdot B_{11}\\P_4 = A_{22} \cdot S_4 = A_{22}\cdot B_{21} - A_{22} \cdot B_{11}\\P_5 = S_5 \cdot S_6 = A_{11} \cdot B_{11} + A_{11} \cdot B_{22} + A_{22} \cdot B_{11} + A_{22} \cdot B_{22}\\P_6 = S_7 \cdot S_8 = A_{12} \cdot B_{21} + A{12} \cdot B_{22} - A_{22} \cdot B_{21} - A_{22} \cdot B_{22}\\P_7 = S_9 \cdot S_{10}= A_{11} \cdot B_{11} + A_{11} \cdot B_{12} - A_{21} \cdot B_{11} - A_{21} \cdot B_{12} P1​=A11​⋅S1​=A11​⋅B12​−A11​⋅B22​P2​=S2​⋅B22​=A11​⋅B22​+A12​⋅B22​P3​=S3​⋅B11​=A21​⋅B11​+A22​⋅B11​P4​=A22​⋅S4​=A22​⋅B21​−A22​⋅B11​P5​=S5​⋅S6​=A11​⋅B11​+A11​⋅B22​+A22​⋅B11​+A22​⋅B22​P6​=S7​⋅S8​=A12​⋅B21​+A12⋅B22​−A22​⋅B21​−A22​⋅B22​P7​=S9​⋅S10​=A11​⋅B11​+A11​⋅B12​−A21​⋅B11​−A21​⋅B12​
    注意,上述公式中只有中间一列需要计算。

  4. 通过PiP_iPi​计算C11,C12,C21,C22C_{11}, C_{12}, C_{21}, C_{22}C11​,C12​,C21​,C22​,花费时间Θ(n2)\Theta(n^2)Θ(n2)。
    C11=P5+P4−P2+P6C12=P1+P2C21=P3+P4C22=P5+P1−P3−P7 C_{11} = P_5 + P_4 - P_2 + P_6\\C_{12} = P_1 + P_2\\C_{21} = P_3 + P_4\\C_{22} = P_5 + P_1 - P_3 - P_7 C11​=P5​+P4​−P2​+P6​C12​=P1​+P2​C21​=P3​+P4​C22​=P5​+P1​−P3​−P7​
    综合可得如下递归式:
    T(n)={Θ(1)若n=17T(n2)+Θ(n2)若n>1 T(n) = \begin{cases}\Theta(1) & 若n = 1\\7T(\frac{n}{2}) + \Theta(n^2) & 若n >1 \end{cases} T(n)={Θ(1)7T(2n​)+Θ(n2)​若n=1若n>1​
    进而求出时间复杂度为:T(n)=Θ(nlog27)T(n) = \Theta(n^{log_{2}^{7}})T(n)=Θ(nlog27​)

四、Strassen算法的代码实现

我们以MNN中关于Strassen算法源码实现来学习:https://github.com/alibaba/MNN/blob/master/source/backend/cpu/compute/StrassenMatmulComputor.cpp。

类StrassenMatrixComputor提供了3个API供调用:

API说明
_generateTrivalMatMul(const Tensor* AT, const Tensor* BT, const Tensor* CT);普通矩阵乘法计算
_generateMatMul(const Tensor* AT, const Tensor* BT, const Tensor* CT, int currentDepth);Strassen算法的矩阵乘法
_generateMatMulConstB(const Tensor* AT, const Tensor* BT, const Tensor* CT, int currentDepth);Strassen算法的矩阵乘法(和MatMul的区别在于内存Buffer是否允许复用)

我们以_generateMatMul为例来学习下Strassen算法如何实现,可以分成如下几步:

第一步:使用Strassen算法收益判断

在矩阵操作中,因为需要对矩阵的维数进行扩展,涉及大量读写操作,这些读写操作都需要大量循环,如果读写次数超出使用Strassen乘法的收益的话,就得不偿失了,那么就使用普通的矩阵乘法。

/* 
Compute the memory read / write cost for expand Matrix Mul need eSub*lSub*hSub*(1+1.0/CONVOLUTION_TILED_NUMBWR), Matrix Add/Sub need x*y*UNIT*3 (2 read 1 write) 
*/

float saveCost = (eSub * lSub * hSub) * (1.0f + 1.0f / CONVOLUTION_TILED_NUMBWR) - 4 * (eSub * lSub) * 3 - 7 * (eSub * hSub * 3); 
if (currentDepth >= mMaxDepth || e <= CONVOLUTION_TILED_NUMBWR || l % 2 != 0 || h % 2 != 0 || saveCost < 0.0f) 
{ 
    return _generateTrivialMatMul(AT, BT, CT); 
}

第二步:分块

将矩阵$A,B,C$3个矩阵都分成4块:

auto aStride = AT->stride(0); 
auto a11 = AT->host<float>() + 0 * aUnit * eSub + 0 * aStride * lSub; 
auto a12 = AT->host<float>() + 0 * aUnit * eSub + 1 * aStride * lSub; 
auto a21 = AT->host<float>() + 1 * aUnit * eSub + 0 * aStride * lSub; 
auto a22 = AT->host<float>() + 1 * aUnit * eSub + 1 * aStride * lSub; 
auto bStride = BT->stride(0); 
auto b11 = BT->host<float>() + 0 * bUnit * lSub + 0 * bStride * hSub; 
auto b12 = BT->host<float>() + 0 * bUnit * lSub + 1 * bStride * hSub; 
auto b21 = BT->host<float>() + 1 * bUnit * lSub + 0 * bStride * hSub; 
auto b22 = BT->host<float>() + 1 * bUnit * lSub + 1 * bStride * hSub; 
auto cStride = CT->stride(0); auto c11 = CT->host<float>() + 0 * aUnit * eSub + 0 * cStride * hSub; 
auto c12 = CT->host<float>() + 0 * aUnit * eSub + 1 * cStride * hSub; 
auto c21 = CT->host<float>() + 1 * aUnit * eSub + 0 * cStride * hSub; 
auto c22 = CT->host<float>() + 1 * aUnit * eSub + 1 * cStride * hSub;

第三步:分治和递归

Strassen算法核心就是分治思想。这一步可以写成下列所示伪代码:

1. If n = 1 Output A × B 
2. Else 
3. Compute A11,B11, . . . ,A22,B22 % by computing m = n/2 
4. P1 Strassen(A11,B12 − B22) 
5. P2 Strassen(A11 + A12,B22) 
6. P3 Strassen(A21 + A22,B11) 
7. P4 Strassen(A22,B21 − B11) 
8. P5 Strassen(A11 + A22,B11 + B22) 
9. P6 Strassen(A12 − A22,B21 + B22) 
10. P7 Strassen(A11 − A21,B11 + B12) 
11. C11 P5 + P4 − P2 + P6 
12. C12 P1 + P2 
13. C21 P3 + P4 
14. C22 P1 + P5 − P3 − P7 
15. Output C 
16. End If

例如其中的一步代码如下所示:

{ 
    // S1=A21+A22, T1=B12-B11, P5=S1T1 
    auto f = [a22, a21, b11, b12, xAddr, yAddr, eSub, lSub, hSub, aStride, bStride]() { 
    MNNMatrixAdd(xAddr, a21, a22, eSub * aUnit / 4, eSub * aUnit, aStride, aStride, lSub); 
    MNNMatrixSub(yAddr, b12, b11, lSub * bUnit / 4, lSub * bUnit, bStride, bStride, hSub); 
}; 

    mFunctions.emplace_back(f); 
    auto code = _generateMatMul(X.get(), Y.get(), C22.get(), currentDepth); 
    if (code != NO_ERROR) 
    { 
        return code; 
    } 
}

递归执行,得到最终结果!

矩阵乘法复杂度分析 一 背景 在很多机器学习或者数据挖掘论文中,里面或多或少的涉及到算法复杂度分析。进一步思考,是如何得到的呢? 很长时间里,我也感受到比较疑惑,阅读论文过程中,在涉及到这部分内容时,会直接跳过算法复杂度分析这快。 其一是因为比较烧脑。虽然知道复杂度分析是对算法总体上的概况,用来进行算法间好坏的比较(由此可见,作要性)。 其二是算法分析基础比较薄弱(个人主观上也是不想的)。 算法复杂度在《数据结构》课程中也或多或少的涉猎,说完全不知道属于自己骗自己,简单的一些例子还是会分析的,但当涉及到复杂的目标方程 阅读详情

相关推荐

矩阵乘法的计算复杂度

结论: A∗B=(i,m)∗(m,j)A*B=(i, m)*(m, j)A∗B=(i,m)∗(m,j)的计算复杂度为O(i∗j∗m)O(i*j*m)O(i∗j∗m) 怎么来的: 输出矩阵C为(i,j)(i, j)(i,j),遍历输出矩阵,C矩阵中的每个元素由A,B矩阵中对应的m对数字相乘相加而来,遍历m对数做相乘相加的复杂度为O(m)O(m)O(m),所以总共三轮循环,复杂度为O(i∗j∗m)O(i*j*m)O(i∗j∗m) 实际实现: a = [[1, 2, 3], [4, 5, 6]] b

lt1103725556的博客 3420

斯特拉森(Strassen)算法

斯特拉森算法简介 先套用一下百度百科: 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 C语言描述 #include <stdio.h> #include<malloc.h> int MUL( int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixSize ); int SUB(int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixS

weixin_43736127的博客 1万+

Strassen+CUDA矩阵乘法实现550倍加速

文章目录CPU简单暴力运算并行多线程+Strassen矩阵乘法关于Strassen算法具体实现CUDA+Strassen矩阵乘法 CPU简单暴力运算 矩阵乘法C=A*B就是把A中的每一行去乘以B中的每一列,得到的数就是C中某行某列的元素,下面是简单的三层循环的实现 ma,mb指矩阵A和B的行数,na,nb列数 float* matrix_product_v1(float* matrixA, float* matrixB, int ma, int na, int mb, int nb) { float

DiStaNcE9790的博客 1103

矩阵算法之矩阵乘法

1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

天之道居同文。 3万+

黑马程序员____矩阵相乘常规法和Strassen方法算法分析

----------------------android培训、java培训、期待与您交流! ---------------------- 矩阵相乘是计算机编程领域的常见问题。按照常规方法解决问题的算法复杂度为,在矩阵规模超过一定规模后,复杂度增长使得计算时间过长,无法令人满意。显然,矩阵相乘的下界在,但这个想法过于理想。目前得到的最优方案为,由于最优方案的实现过于复杂,没有在计算机上

handawnc的专栏 7694

AlphaTensor:AI如何重新发明矩阵乘法算法

矩阵乘法是深度学习与高性能计算的基石操作,其算法效率直接决定大模型训练速度、GPU显存占用与能耗水平。传统上依赖Strassen等人工构造的渐进式优化,存在搜索空间爆炸、评估函数非线性、先验知识难编码三大瓶颈。AlphaTensor创新性地将该问题建模为张量分解的强化学习任务,通过符号引擎+策略网络+价值网络协同,在4×4、8×8等关键规模上发现少于人类记录的标量乘法次数(如47次),实现从‘解题’到‘设计解题方法’的范式跃迁。该技术已落地PyTorch底层优化与定制化CUDA核函数,成为AI for Sc

weixin_33985507的博客 896

矩阵相乘的strassen算法_矩阵乘法的Strassen算法

目录一、矩阵相乘二、矩阵相乘的朴素算法三、Strassen其人及其算法四、Strassen的理想五、附Strassen的一种代码实现六、参考一、矩阵相乘矩阵相乘,是指一个m*n的矩阵和一个n*k的矩阵相乘而得到一个m*k矩阵的一种运算。矩阵相乘可用于线性变换和矩阵分解[1]。二、矩阵相乘的朴素算法矩阵相乘的一般步骤是第一个矩阵的第i行*第二个矩阵的第j列,得到第三个矩阵的第i行第j列元素因此其素朴...

weixin_39992199的博客 902

AlphaTensor:AI发现矩阵乘法新算法的原理与工程实践

矩阵乘法是深度学习、科学计算和图形渲染的底层核心运算,其效率直接决定AI模型训练速度与边缘设备实时性。传统算法如三重循环和Strassen方法受限于理论假设与硬件适配性,难以兼顾数学最优与工程可用。AlphaTensor创新性地将矩阵乘法问题建模为张量分解游戏,利用强化学习在离散数学空间中搜索可验证、可编译、硬件友好的低乘法复杂度算法。它不替代现有框架,而是生成面向GPU/TPU等特定架构优化的U/V/W参数矩阵,支持C++高性能实现与PyTorch无缝集成。该技术标志着从‘调优算子’迈向‘发现算子’的范式

weixin_33836874的博客 377

Strassen矩阵乘法实战:CPU上高效实现的工程细节

矩阵乘法是线性代数与高性能计算的核心基础操作,其性能直接影响AI训练、科学仿真和实时系统效率。朴素三重循环虽概念简单,但因访存局部性差、Cache命中率低,在中等规模(n≥256)时成为显著瓶颈。Strassen算法通过分治重构计算流,以7次子矩阵乘替代8次,降低理论复杂度至O(n^2.807),更关键的是天然适配现代CPU的缓存层级与SIMD向量化——它不单纯减少乘法次数,而是优化数据调度与内存访问模式。工程落地中,需结合动态分块、寄存器tiling、行/列视角切换及递归转迭代等关键技术,并依据硬件特性(

weixin_30861459的博客 332

矩阵求逆算法的时间与空间复杂度对比:从理论到实践

本文深入对比了矩阵求逆算法的时间与空间复杂度,从理论到实践剖析了伴随矩阵法、高斯消元法和LU分解法等主流方法。伴随矩阵法因阶乘级复杂度而缺乏实用性,高斯消元法及其变种提供了稳定的O(n³)时间复杂度解决方案,而LU分解法则在需要重复求解时更具优势。文章还探讨了针对对称正定矩阵的Cholesky分解等优化策略,并强调了在实际应用中优先使用线性方程组求解器而非显式求逆的重要性。

kafka6courier的博客 714

Java矩阵编程实战:从内存布局到生产级优化

矩阵运算是线性代数在工程中的核心落地形式,本质是基于内存连续性的高效数值计算。其性能瓶颈70%源于JVM内存模型与CPU缓存行为的错配,而非算法复杂度;Java类型擦除、堆内/堆外内存管理、浮点精度漂移等特性进一步加剧实现难度。掌握一维数组内存对齐、CSR稀疏存储、ZGC大对象回收及JNI BLAS桥接等关键技术,可显著提升科学计算、机器学习接口封装与实时图形渲染等场景的稳定性与吞吐。本文聚焦Matrix Programs in Java这一高频但易被低估的工程能力,提供从零构建高性能矩阵库的完整路径。

weixin_33831673的博客 350

矩阵乘法复杂度优化实战:从理论到应用

本文深入探讨了矩阵乘法复杂度优化的核心价值与实践方法,从朴素算法的复杂度分析到Strassen算法的工程实践,再到稀疏矩阵的特化处理。通过实际案例展示了优化技术在推荐系统、机器学习等领域的应用效果,帮助开发者显著提升计算效率。文章还介绍了前沿工具链和性能调优技巧,为处理大规模矩阵运算提供实用指导。

weixin_29207533的博客 495

FunSearch:面向算法优化的函数级进化搜索引擎

算法优化是计算理论与高性能工程的核心命题,其本质是在满足数学正确性的前提下,最小化计算步骤或资源开销。传统方法依赖人工推导或端到端大模型生成,但易陷入数据稀缺、评估失真与幻觉错误等瓶颈。FunSearch另辟蹊径,将优化建模为‘函数空间中的可验证进化搜索’——以合法Python语法为边界,用强化学习驱动变异、沙盒执行保障功能等价、SMT求解器(如Z3)完成形式化验证,实现结果导向与符号可证的双重闭环。该范式天然适配矩阵乘法、FFT、图算法等离散计算结构的重构任务,已在3x3矩阵乘法中发现41步新解,超越人工

dicui3114的博客 440

别再死磕串行了!用MPI+Cannon算法搞定大矩阵乘法,实测加速比提升指南

本文深入探讨了如何利用MPI并行计算框架结合Cannon算法优化大规模矩阵乘法性能。通过详细分析串行算法的瓶颈,介绍Cannon算法的核心思想与MPI实现,实测数据显示可将计算时间从小时级压缩到分钟级,显著提升加速比。文章还提供了性能优化技巧和工程实践中的解决方案,适用于科学计算和机器学习领域的高性能需求。

weixin_30800807的博客 375

win11本地部署 DeepSeek-R1 大模型!免费开源,媲美OpenAI-o1能力,断网也能用

是否安装成功,然后直接运行部署deepseek-r1的命令。,出现下面界面即为安装成功。在cmd窗口中先输入。

记录学习编程的日常 2991

解决屏幕不亮难题:慷智SerDes DE信号极性配置避坑指南

本文深入探讨了基于慷智AIM95x系列SerDes芯片的嵌入式显示系统开发中,因DE信号极性配置不匹配导致屏幕不亮的典型故障。文章详细解析了DE信号的核心作用与极性定义,提供了慷智SerDes芯片中DE极性寄存器的具体配置方法与调试记录,并给出了从隔离问题、对比时序到波形验证的系统性排查流程,帮助工程师快速定位并解决此类隐蔽问题。

weixin_29185493的博客 139

矩阵相乘的strassen算法_收藏 | 计算机、数学、运筹学等领域的32个重要算法

来源:大数据本文约2500字,建议阅读5分钟。本文为你分享计算机、数学、运筹学等领域的32个重要算法。[ 导读 ] 奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以...

weixin_35339622的博客 329

5分钟搞定:用Pyannote和Whisper实现带说话人分离的语音转文字(附完整代码)

本文详细介绍了如何快速构建一个集成了说话人分离功能的语音转文字系统。通过结合OpenAI的Whisper模型进行高精度语音识别和Pyannote模型实现说话人分离,并提供了完整的代码实现、环境搭建指南以及核心的对齐与合并逻辑,帮助开发者高效处理会议录音、访谈等多说话人音频,实现自动化转录。

threejs5artist的博客 635

突破300年数学难题!陶哲轩出题,DeepMind通用科学AI智能体一夜屠龙

实现多边形最优嵌套填充;通过找到更优的方法,将大型矩阵乘法分解为更易于处理的子问题,AlphaEvolve将Gemini架构中关键内核加速了23%,让训练时间缩短了1%。在20%情况下,改进了已知的最佳解决方案,并在相应的开放问题上取得了进展。2023年,谷歌首次展示了LLM的惊人能力:生成用计算机代码编写的函数,不仅能帮助发现开放科学问题的新知识,还能证明其正确性。以困扰数学家300多年「亲吻数」难题为例,AlphaEvolve在11维空间中,发现了593个外球的配置,刷新了该问题的下限。

数据派THU 231

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

heygem本地部署报错:SQLite3 can only bind numbers, strings, bigints, buffers, and null...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位大厂资深架构师和一线开发多年实战经验沉淀,

**My Coding Family** 3246

万字书籍速通之《算法设计与分析》(1)

《算法设计与分析》速通系列(1)摘要: 本篇系统梳理《算法设计与分析》前5章核心内容,聚焦五大基础算法范式: 算法基础 算法五大特性(有穷性、确定性等) 复杂度分析:大O记号、常见量级排序(O(1)<O(logn)<O(n²)等) 伪代码规范与抽象机制(ADT/数据结构/递归迭代) 分治法 递归三要素(基准情形+递归步骤+问题分解) 主定理快速求解递归式 动态规划 四步法模板(定义状态→转移方程→初始条件→递推顺序) 经典问题:矩阵连乘、LCS、0-1背包 贪心算法 两大条件(贪心选择性质+最优子结构) 交

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 347

Trae辅助开发完全教程:从入门到企业级实战

《Trae AI IDE完全教程》系统介绍了这款AI驱动的下一代集成开发环境。教程从基础入门到实战应用,详细讲解了Trae的双重开发模式(IDE/SOLO)、智能编程助手CUE、行内对话、模型管理等核心功能。内容包括环境配置、项目创建、Python开发示例,以及RPC框架和iOS应用两个实战案例。Trae通过深度整合AI技术,显著提升编码效率,支持多种编程语言和主流模型,适合从新手到企业级开发者的不同需求。本教程帮助开发者快速掌握Trae的使用技巧,实现AI辅助下的高效编程。

MrLi的博客 763

GPU矩阵乘法深度优化:DeepGEMM原理与cuBLASLt实战调优

GEMM(通用矩阵乘法)是深度学习计算的核心原子操作,其性能直接决定模型训练与推理的吞吐、能效和延迟。在GPU上,GEMM并非简单循环,而是需协同内存层次(寄存器/Shared Memory/L2)、计算单元(Tensor Core/WMMA)、数据搬运引擎(TMA)及算法策略(分块/融合/对齐)的系统工程。DeepGEMM并非新模型,而是对NVIDIA GPU上高度定制化GEMM实现的统称,聚焦FP16/FP8/INT4混合精度、batched场景与Hopper/Ampere架构适配。其技术价值在于将理论

weixin_28678151的博客 174

RT-DETR改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 139

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 经典算法:从约瑟夫问题说开去
下一篇: 使用Hugo搭建个人网站
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值