Algorithm 如何尽可能快地进行矩阵计算

Algorithm 如何尽可能快地进行矩阵计算,algorithm,performance,math,matrix,matrix-multiplication,Algorithm,Performance,Math,Matrix,Matrix Multiplication,纯粹为了我自己的知识和对代码和计算机的理解,我正在尝试创建一个包含多个矩阵函数的数组/矩阵类,然后我将在任何需要矩阵或矩阵类的项目中使用它。最重要的是,我想使用这个矩阵/数组类创建一个神经网络库,因此要求它尽可能快 我需要的最快的函数是两个矩阵的矩阵积计算,然而,我几乎没有运气尝试用较大的矩阵快速计算 我目前计算点积的方法是: 注意,这段代码是用python编写的,但是,如果python不是最佳语言,我可以使用任何其他语言 a=[[1,2,3],[4,5,6]] b=[[1]、[2]、[3]]

纯粹为了我自己的知识和对代码和计算机的理解,我正在尝试创建一个包含多个矩阵函数的数组/矩阵类,然后我将在任何需要矩阵或矩阵类的项目中使用它。最重要的是,我想使用这个矩阵/数组类创建一个神经网络库,因此要求它尽可能快

我需要的最快的函数是两个矩阵的矩阵积计算,然而,我几乎没有运气尝试用较大的矩阵快速计算

我目前计算点积的方法是:

注意,这段代码是用python编写的,但是,如果python不是最佳语言,我可以使用任何其他语言

a=[[1,2,3],[4,5,6]]
b=[[1]、[2]、[3]]
def dot(a、b):
c=[[0表示范围内的j(len(b[i])]表示范围内的i(len(a))]
对于范围内的i(len(c)):
对于范围内的j(len(c[i]):
t=0
对于范围内的k(len(b)):
t+=a[i][k]*b[k][j]
c[i][j]=t
返回c
印刷品(dot(a,b))
# [[14], [32]]
我研究过Intel MKL(我有一个Intel core i7)和其他BLAS实现,比如OpenBLAS,但是我没有得到任何有效的结果,再多的谷歌搜索也不能使它们有效,所以我的问题是,计算两个矩阵的点积的最快方法是什么?(目前CPU和内存使用对我来说没有多大关系,但是,更高效会更好)

附言:

我试图不使用外部库(例如,在python中使用numpy)来完成所有这些工作

*****更新*****

我用的是mac电脑

*****更新2*****

感谢大家的帮助,但是,我不确定如何实施这些计算点积的方法,因为我的数学技能还不足以理解这些方法的含义(我还没有开始参加GCSE),尽管我会记住这些想法,并进一步尝试这些想法


再次感谢大家的帮助。

如果可能,您可以使用GPU进行非常快速的计算

  • 你可以使用GPU

    正如阿卜杜拉齐兹·阿卜杜拉捷夫在回答中所建议的那样。然而,这限制了使用GPU的计算机使用lib

  • 并行化大矩阵的点积

  • 使用SIMD指令

  • 使用最先进的算法

    使用更先进的技术,大数据集上的某些操作可以更快地完成,而这些技术对于小矩阵来说太慢了。。。通常涉及或。。。矩阵乘法是点积的集合,点积是卷积的形式,所以FFT方法应该是适用的,但对于矩阵/向量,从来并没有这样做过

    也有专门针对矩阵的特殊算法,如

    对于幂,你可以通过平方来使用幂,对于
    sqr
    我认为你可以简化得更多一些,有些乘法是一样的

  • Python是最不理想的,因为它的缓慢我会在C++中做这种事情,或者即使需要极端速度(如SIMD指令使用)也与ASM结合。Irc你仍然可以使用Python中的C++创建的LIBS(链接为DLL,Obj.…)< /P>


    但是,如果您需要快速神经网络,则使用专用硬件。也有神经网络处理IC。

    我稍微重复了一下你的问题,因为我觉得如果你不同意,它们更适合回滚编辑…矩阵通常有多大。实现一个有效的矩阵,大矩阵上的矩阵乘法并不是那么简单。如果你想用BLAS实现对简单的Cython实现进行基准测试,你可以用floats->BLAS和整数数组(Cython实现)对np.dot()进行基准测试@Spektre谢谢,我觉得这些标记很好@max9111我已经试过cython了,虽然我确实取得了更好的效果,但效果并不令人满意。矩阵可以是5x5到1000x1000之间的任何值,但是通常在该范围的较小一端。如果您的要求是矩阵乘法尽可能快,那么BLAS(IntelMKL提供了一个公认的实现,但还有其他实现)就是一条路要走。滚动您自己的是/将是一个有趣的练习,但如果您最终实现的“英特尔MKL”的执行率在25%以内,您将做得非常好。我不明白为什么你愿意使用MKL而不使用NUMPY(这可能是一个低级别的BLA实现)。我已经下载了CUDA并安装了它,但是,我在文件中找不到,安装程序上的示例按钮什么也没做,我错过了什么吗?你应该用C++来使用它。如果您有VisualStudio2019,您可以从CUDA项目开始。他们的文档中有一个矩阵乘法的例子。我在mac上,visual studio在mac上不完全可用,所以我应该怎么做才能解决这个问题?@Pencilcaseman CUDA是一个库,所以你应该将它作为DLL或OBJ或你在mac编程环境中的任何扩展链接到你的项目。如果CUDA不是为MAC提供的,那么您可以使用OpenGL GLSL着色器执行大致相同的操作。。。OpenGL应该在MAC上运行,但你需要一个像样的gfx驱动程序。。。如果你不能熟练使用GL和GLSL,这将是一件很难做到的事情。你可以在Mac中使用它,如本文所述。你建议我如何并行化dot产品,以及我应该使用哪种语言,C/C++还是java,因为我比较熟悉java@PencilcasemanJAVA和python在设计上通常比C/C++慢得多。并行化是由线程完成的。你可以在你拥有的CPU核之间划分点积。由于您只读取输入矩阵,因此不需要共享锁,每个点结果进入不同的输出矩阵单元,因此也不需要锁。在windows上,在获取系统关联掩码后,您有关于muc的信息