首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过SSE加速矩阵乘法(C++)

通过SSE加速矩阵乘法(C++)

SSE是指Streaming SIMD Extensions,是一种SIMD指令集,它可以加速矩阵乘法等计算密集型任务。通过使用SSE指令集,可以在C++中实现矩阵乘法的加速。

以下是一个使用SSE加速矩阵乘法的示例代码:

代码语言:c++
复制
#include<iostream>
#include <emmintrin.h> // SSE2

void matrix_multiply(float* A, float* B, float* C, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            float sum = 0;
            for (int k = 0; k < n; k++) {
                sum += A[i*n+k] * B[k*n+j];
            }
            C[i*n+j] = sum;
        }
    }
}

void matrix_multiply_sse(float* A, float* B, float* C, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j += 4) {
            __m128 sum = _mm_setzero_ps();
            for (int k = 0; k < n; k++) {
                __m128 a = _mm_set1_ps(A[i*n+k]);
                __m128 b = _mm_load_ps(&B[k*n+j]);
                sum = _mm_add_ps(sum, _mm_mul_ps(a, b));
            }
            _mm_store_ps(&C[i*n+j], sum);
        }
    }
}

int main() {
    int n = 1000;
    float* A = new float[n*n];
    float* B = new float[n*n];
    float* C = new float[n*n];

    for (int i = 0; i < n*n; i++) {
        A[i] = i;
        B[i] = i;
    }

    matrix_multiply(A, B, C, n);
    matrix_multiply_sse(A, B, C, n);

    delete[] A;
    delete[] B;
    delete[] C;

    return 0;
}

在上述代码中,matrix_multiply函数是一个普通的矩阵乘法函数,而matrix_multiply_sse函数则是使用SSE指令集实现的加速版本。

matrix_multiply_sse函数中,我们使用__m128类型来表示一个128位的向量,使用_mm_setzero_ps函数来初始化向量为0,使用_mm_set1_ps函数来将一个标量值复制到向量中,使用_mm_load_ps函数来加载向量数据,使用_mm_mul_ps函数来实现向量乘法,使用_mm_add_ps函数来实现向量加法,使用_mm_store_ps函数来存储向量数据。

通过使用SSE指令集,可以大大加速矩阵乘法等计算密集型任务的执行速度。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

矩阵乘法加速器的设计框架

而这两点,实则是设计一个优秀的,可持续迭代的加速器的基础。本文将从矩阵加速器出发,通过一些简化的模型,给出简单的设计框架。 1....矩阵乘法和硬件模型 一般来说,矩阵乘法加速器中需要加速的计算可表示为 \[ C = A\times B + C \] 其中 (Ain R^{mtimes k}) , (Bin R^{ktimes n}...带宽优化的矩阵乘法加速器设计 和一般的处理器相比,特定的加速器可以设计数量巨大的计算单元(譬如Google TPU V1设计了65536个乘法器);但是DDR的带宽的提升却是有限的。...矩阵乘法加速器的设计目的一般是为了加速大规模的矩阵乘法计算,为了简化分析过程,假设矩阵 (A,B,C) 的大小 (S_A,S_B,S_C) 均远大于 (M) ,即计算过程中每次只能在缓存中存放一部分数据...计算优化的矩阵乘法加速器设计 依据第二节的结果,每次计算的子矩阵为 \[C_{sub}^{p\times q} += A_{sub}^{p\times 1} + B_{sub}^{1\times q}

2.9K10
  • 用Versal FPGA加速矩阵乘法

    AIE核和ARM CPU可以使用C/C++编程,而PL可以通过RTL和C/C++代码利用High-Level Synthesis(HLS)进行编程。...以下是该部分内容的总结: 数据流和映射策略: 作者提出了一个矩阵乘法加速器的设计方法,该方法利用了数百个AI Engine (AIE)单元,通过精心规划数据流动和计算资源的分配,实现高效的密集矩阵乘法。...通过上述设计和优化,CHARM旨在解决Versal ACAP架构上密集矩阵乘法加速器的效率和资源分配问题,尤其关注于处理大小不一的矩阵乘法操作,以提高整体系统性能。...论文结果总结 CHARM架构的有效性: CHARM架构成功地解决了大型和小型矩阵乘法操作在Versal ACAP架构上的效率问题,通过设计多样化的加速器,每个加速器针对特定规模的矩阵乘法进行了优化。...资源和带宽优化: 通过资源分配和数据流优化,CHARM能够最大化每个加速器的计算效率,减少计算和带宽的浪费,尤其是对于小型矩阵乘法

    13410

    《游戏引擎架构》阅读笔记 第一部分第4章

    ---- 目录 第4章 游戏所需的三维数学 4.1 在二维中解决三维问题 4.2 点和矢量 4.3 矩阵 4.4 四元数 4.5 比较各种旋转表达方式 4.6 其他数学对象 4.7 硬件加速的SIMD运算...(P139 1) 矩阵乘法可以计算点和矢量的缩放、旋转等变换。(P139 last2) 齐次坐标进行位移等计算。...独一无二地表达任意旋转,旋转可通过矩阵乘法直接计算。...英特尔陆续加入多个版本的扩展指令集,称为单指令数据流扩展(streaming SIMD extensions,SSE),其中第一个SSE版本出现于奔腾III处器。...此模式中,4个32位float值被打包进单个128位寄存器,单个指令可对4对浮点数进行并行运算,如加法或乘法。当要计算四元素矢量和4×4矩阵相乘,这个模式正合我们所需!

    36010

    图像处理中任意核卷积(matlab中conv2函数)的快速实现。

    只不过由于这些算法的卷积矩阵的特殊性,一般不会直接实现它,而是通过一些优化的手段让计算量变小。...但是有些情况下卷积矩阵的元素值无甚规律或者有特殊要求,无法通过常规手段优化,这个时候只能通过原始的方式实现。因此,如何快速的实现图像的任意卷积矩阵操作也有必要做适当的研究。      ...我的优化方法主要包括以下几个方面:       一:使用SSE进行乘法计算,由于SSE可以一次性进行4个单精度浮点数的计算,因此可以有明显的速度提升。      ...那么如果我们也同时获得了需要被卷积的部分数据的话(卷积核肯定和卷积矩阵一样大小,且也应该是16字节对齐的),可以用如下的SSE的代码进行乘法计算: float MultiplySSE(float *Kernel...(扩充后)的元素数量大于16时,我们采用了4路并行的SSE乘法实现,我在I3的CPU上测试时,2路SSE和4路SSE已经没有啥大的区别了,而在I5的CPU上则4路还是有较为明显的提高,因此采用4路SSE

    3.8K80

    警告:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

    原因: 除了通常的算术和逻辑,现代CPU提供了许多低级指令,称为扩展,例如, SSE2,SSE4,AVX等来自维基百科: 高级矢量扩展(AVX)是英特尔在2008年3月提出的英特尔和AMD微处理器的x86...指令集体系结构的扩展,英特尔首先通过Sandy Bridge处理器在2011年第一季度推出,随后由AMD推出Bulldozer处理器在2011年第三季度.AVX提供了新功能,新指令和新编码方案。...特别是,AVX引入了融合乘法累加(FMA)操作,加速了线性代数计算,即点积,矩阵乘法,卷积等。几乎所有机器学习训练都涉及大量这些操作,因此将会支持AVX和FMA的CPU(最高达300%)更快。...由于tensorflow默认分布是在没有CPU扩展的情况下构建的,例如SSE4.1,SSE4.2,AVX,AVX2,FMA等。

    45520

    C++那些事之高性能SIMD

    C++那些事之高性能SIMD 最近在看相关向量化的内容,看起来有点头大,借此机会,学习一下高性能SIMD编程。...但是,许多任务涉及对大量数据执行相同的操作,例如对数组中的所有元素进行加法、乘法或逻辑操作等。SIMD编程通过向CPU提供专门的指令集,使得CPU能够同时对多个数据元素执行相同的操作。...这种处理方式特别适合涉及向量、矩阵、图像、音频和视频等数据的计算。 目前比较常用的有SSESSE2、AVX128、AVX256、AVX512。...于是,找到了下面这个表格: Abbreviation Full Name C/C++ Equivalent ps packed single-precision float ph packed half-precision...simd,我们可以实现一些非常有趣的算法,加速对数组,批量数据的处理。

    81330

    英特尔MKL加速AMD计算可达3倍?AMD Yes

    近日,一个优化 AMD CPU 的帖子在 Matlab 社区引起讨论——通过几行代码,将 AMD CPU 加速 250%,进而帖子作者将方法推广到了其他社区,介绍了更普适性的优化方法。...如果 CPU 是 AMD 的,则可以通过系列调整,使得性能有较大的提升。...如果是 AMD CPU,不管 CPU 到底支不支持更高效的 SIMD 扩展,MKL 不支持使用 SSE3-SSE4 或 AVX1/2 扩展,它只能回到 SSE。...还真有开发者直接上手测试,Inori 在 Reddit 上表明,通过实际基准测试,他确认这样做能提升 NumPy 25% 到 90% 的性能。...如下所示,在 AMD 不采用 MKL 的情况下,两个 4096*4096 的矩阵乘法需要 1 秒钟,而加了 MKL 后只需要 0.56 秒。 ?

    2.5K30

    推理速度数倍提升,大幅简化多GPU后端部署:Meta发布全新推理引擎AITemplate

    在水平融合中,AITemplate 目前可以把不同输入形状的矩阵乘法 (GEMM)、矩阵乘法和激活函数,以及 LayerNorm、LayerNorm 和激活函数进行融合。...在纵向融合中,AITemplate 支持超过传统标准的 Elementwise 融合,包括: 通过 CUTLASS 和 Composable Kernel 支持了矩阵和 Elementwise 算子融合...; 为 Transformer 的 Multi-head Attention 提供了矩阵乘法和内存布局转置融合; 通过张量访问器对内存操作,如 split、slice、concatenate 等进行融合来消除内存搬运...head attention 模块,目前 AITemplate 在 CUDA 平台使用了 Flash Attention,在 AMD 平台上使用了 Composable Kernel 提供的通用背靠背矩阵乘法融合...AITemplate 在 Python 中找到性能最优的 GPU 模板参数,再通过 Jinja2 渲染出最终的 C++ 代码。

    1.2K20

    嵌入式HLS 案例开发步骤分享——基于Zynq-701020工业开发板(3)

    图 47矩阵乘法运算函数如下:图 48matrix_demo_test.cpp 中提供了矩阵乘法运算函数 mmult_sw(),程序将 mmult_sw()的运算结果和顶层函数 standalone_mmult...图 56图 57可看到矩阵乘法运算函数里的三个 for 循环均为顺序运行, 因此耗时最长。...打开solution2 的Analysis, 可看到矩阵乘法运算函数里的 L1/L2 for 循环并行执行,因此耗时较短。...图 644.4.1 PL 端 IP 核测试 Vivado 工程说明浮点矩阵乘法运算加速器 IP 核通过 AXI DMA IP 核连接到 PS 端 ACP 接口,从而连通到 PS 端 L2 缓存。...AXI Timer IP 核用于计数,可通过其寄存器来计算浮点矩阵乘法运算加速器 IP 核的运算时间。

    60630

    JPEG编码原理与快速编解码

    YUV诞生于黑白电视向彩色电视过渡的时期,设计如此是因为YUV的Y-亮度分量可以直接被黑白电视显示,因此彩色电视信号得以兼容黑白电视[1];并且由于早期电视信号带宽有限,可以通过降采样YUV信号的色度分量...Intel在1997年推出了使用64位浮点寄存器的MMX指令,在1999年奔腾III系列处理器上推出了使用128位寄存器的SSE指令,后续在奔腾IV系列处理器上推出的SSE2指令集使得128位XMM寄存器支持被拆分为多个整数...以上各步骤均已被SSE2实现,大部分步骤已有AVX2实现。...降采样,可以充分利用_mm_avg_epu8指令,计算像素色度的均值; 分块,即更换各值位置; 值自减128类似,利用_mm_subs_epi8即可,而DCT本质上是一个矩阵运算(基底按列组成矩阵的逆矩阵...,该矩阵是确定的),因此DCT可以被加速为一个8 \times 8的矩阵与一个8维列向量的乘法; 量化,即向量除法; 调整zig-zag顺序也可以使用向量算数运算完成。

    2.3K20

    解析卷积高速计算中的细节,有代码有真相

    Halide是c++中的一种嵌入式语言,它帮助抽象这些概念,并被设计用来帮助编写快速图像处理代码。通过分解算法(要计算什么)和计划(如何/何时计算),可以更容易地试验不同的优化。...也许矩阵乘法矩阵乘法,或matmul,或Generalized Matrix Multiplication (GEMM)是深度学习的核心。它用于全连接层、RNNs等,也可用于实现卷积。...正确的矩阵是im2col的结果——它必须通过复制原始图像中的像素来构造。左边的矩阵有conv权值,它们已经以这种方式存储在内存中。 ?...生成这个im2col缓冲区和膨胀的内存所花费的时间,必须通过GEMM实现的加速来抵消。 利用im2col,我们已经将卷积运算转化为矩阵乘法。...加速GEMM 原始的方法 在这篇文章的其余部分,我将假设GEMM被执行为 和之前一样,首先让我们对基本的,课本上的矩阵乘法进行计时: for i in 0..M: for j in 0..N

    1.2K20

    拉普拉斯金字塔在多图HDR算法中的应用以及多曝光图像的融合算法简介。

    为了能提高算法的实用性,我们使用C++结合SIMD指令对该过程进行优化。优化的方式主要有以下几个方面:        1、通过适当的改变数据类型来提高速度。        ...实际上,我们在优化时,归一化的那个权重矩阵我也用byte类型来保存数据,原本以为这样每个图的权重有可能会比较小,存在精度损失,不过实际测试,和M代码的结果也没啥特别大的视觉区别。    ...另外,还有内存方面的优化问题,如果建立所有图像的金字塔序列,然后再计算特征合成,这样会占用比较多的内存,特别是图像序列比较多时,实际上我们可以边分解边进行计算,这样带来的好处时速度有适当加速(应该还是cache...原始论文的作者在获取了各个特征的权重后,是使用的乘法来统计特征,我这里也使用了加法进行测试,测试结果是加法的结果比乘法的要稍微暗一点。...区别也不是很大,但是要注意如果是使用乘法,有的时候有些特征的权重为0,为了不让其他特征的权重被淹没掉,建议加一后再乘。

    88120

    优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码)。

    64次加法,上面的DCTbasis为固定的DCT系数矩阵。   ...这种代码一看就想到了有SSE进行优化,PATCHSIZE为8 正好是两个SSE浮点数m128的大小,乘法和加法都有对应的SSE函数,一次性可进行4个浮点加法和浮点乘法,效率当然会高很多,优化后的代码如下所示... /// 2、算法只直接翻译IPOL上的,利用了SSE加速。... /// 3、在JPEG压缩等程序中的8*8DCT变换里优化的算法乘法比较少,但不好利用SSE优化,我用那里的代码测试还比下面的慢。...,在 http://insurgent.blog.hexun.com/1797358_d.html 中提出代码里,只有32次乘法和更少的加法,但是由于这个代码的向量性很差,是很难用SSE进行优化的,我实测的结果时他的代码比我用

    1.6K80

    Doris开发手记2:用SIMD指令优化存储层的热点代码

    于是尝试通过SIMD的指令优化了这部分的CPU热点代码,取得了较好的性能优化效果。借用本篇手记记录下问题的发现,解决过程一些对于C/C++程序性能问题的一些解决思路,希望各位也能有所收获。...通过这种方式,在相同的时钟周期内,CPU能够处理的数据的能力就大大增加了。 ? 传统CPU的计算方式 上图是一个简单的乘法计算,我们可以看到:4个数字都需要进行乘3的计算。...这需要执行 4个load内存指令 4个乘法指令 4个内存回写指令 ? SIMD的计算方式 而通过SIMD指令则可以按批的方式来更快的处理数据,由上图可以看到。原先的12个指令,减少到了3个指令。...我们也可以直接通过Intel提供的库来直接进行向量化编程,比如SSE的API的头文件为xmmintrin.h, AVX的API头文件为immintrin.h。...比如实现的AVX的向量化算法并不能在不支持AVX指令集的机器上运行,也无法用SSE指令集代替。 3.开发起来,解决问题 通过上一小节对SIMD指令的分析。

    1.3K11

    Doris开发手记2:用SIMD指令优化存储层的热点代码

    于是尝试通过SIMD的指令优化了这部分的CPU热点代码,取得了较好的性能优化效果。借用本篇手记记录下问题的发现,解决过程一些对于C/C++程序性能问题的一些解决思路,希望各位也能有所收获。...通过这种方式,在相同的时钟周期内,CPU能够处理的数据的能力就大大增加了。 传统CPU的计算方式 上图是一个简单的乘法计算,我们可以看到:4个数字都需要进行乘3的计算。...这需要执行 4个load内存指令 4个乘法指令 4个内存回写指令 SIMD的计算方式 而通过SIMD指令则可以按批的方式来更快的处理数据,由上图可以看到。原先的12个指令,减少到了3个指令。...我们也可以直接通过Intel提供的库来直接进行向量化编程,比如SSE的API的头文件为xmmintrin.h, AVX的API头文件为immintrin.h。...比如实现的AVX的向量化算法并不能在不支持AVX指令集的机器上运行,也无法用SSE指令集代替。 3.开发起来,解决问题 通过上一小节对SIMD指令的分析。

    1.1K30

    嵌入式硬件开发学习教程——Xilinx Vivado HLS案例 (3)

    ,可加速算法开发的进程,缩短产品上市时间。...图 43 点击后矩阵乘法运算函数如下: 图 44 矩阵乘法运算函数如下: 图 45 matrix_demo_test.cpp中提供了矩阵乘法运算函数mmult_sw(),程序将mmult_sw()的运算结果和顶层函数...图 61 PL端IP核测试Vivado工程说明 浮点矩阵乘法运算加速器IP核通过AXI DMA IP核连接到PS端ACP接口,从而连通到PS端L2缓存。...AXI Timer IP核用于计数,可通过其寄存器来计算浮点矩阵乘法运算加速器IP核的运算时间。...图 62 PS端IP核测试裸机工程说明 PS端运行32*32的浮点矩阵乘法运算,并将PS端和PL端用时进行比较。PL端的浮点矩阵乘法运算用时从AXI Timer IP核中读取。

    1.3K20

    【短道速滑四】Halcon的texture_laws算子自我研究

    -1   -2   -1    0    0    0   1    2   1   卷积矩阵如上所示,那么假如卷积的结果为s,则最终的结果为s >>...如果滤波器的尺寸为5或者7,那么对应的卷积矩阵就是5*5或者7*7的,这各时候直接卷积速度比比较慢,其实,在本算法中,是没有必要这样的,很明显,这是个行列可分离的卷积。   ...他可以一次性实现16次乘法和加法,地方分别是字节数和有符号的字节数,非常有效。...在中间结果到最终值时,又可以利用_mm_madd_epi16这个针对16位数的SSE函数,他同样能一次性实现多个乘法和加法。 ? ?   ...本文Demo下载地址: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,里面的所有算法都是基于SSE实现的。

    85230

    深入了解Google的第一个Tensor Processing Unit(TPU)

    由于我们需要尽快将TPU部署到Google现有的服务器上,因此我们选择将处理器作为外置加速卡进行封装,以便插入SATA硬盘插槽进行安装。...这个乘法和加法的序列可以写成一个矩阵乘法。这个矩阵乘法的输出然后被激活函数进一步处理。即使在处理复杂得多的神经网络模型体系结构时,乘法矩阵通常是运行经过训练的模型中计算量最大的部分。...标准说: “神经网络模型由各种大小的矩阵乘法组成 - 这就是形成一个完全连接的层,或者在CNN中,它往往是较小的矩阵乘法。...即使CPU以千兆赫范围内的时钟速度运行,但仍然需要很长时间才能通过一系列标量操作来执行大型矩阵运算。...改善这种大型矩阵运算的性能的一种有效且众所周知的方法是通过向量处理,其中同时在大量数据元素上同时执行相同的操作。CPU包含指令集扩展,如SSE和AVX,可以表达这种矢量操作。

    2.6K60
    领券