SSE/AVX SIMD编程

SIMD函数的Intel官网

AVX和AVX2指令的介绍

我调用的是函数,不是汇编指令(special C functions called intrinsic functions

每个函数实际调用的可能不止1个指令,例如_mm256_fmadd_ps后面实际调用了3个函数

函数命名规则:_mm<bit_width>_<name>_<data_type> 

<bit_width>是返回值位长度;<name>是功能;<data_type>是输入参数类型;

只需要 #include <immintrin.h> 即可,不需要链接任何库,该头文件包含其他头文件会把函数映射到指令上;

 

初始化函数,是按Little-endian来的,{}里第一个数其实在内存里被放到最后;

_m256_load_*把数据从内存加载到__mm256变量里,要求内存里的数据必须按32位对齐,否则会报段错误;用 _m256_loadu_*来加载不一定对齐的数据;

mm256_maskload_*可用来对付末尾不足256位的数据,比如最后还剩3个float(8个float才满),则mask住的在结果里置0;

整型的计算有adds版本:_mm256_adds_epi8,处理“saturation”,"饱和"问题,即结果超出范围后自动锁定在最大or最小值上;不用带s的会直接返回越界后的数值;

水平相加函数:

乘法,因为位数会增一倍,所以一种函数是只乘一半数目,一种函数是都乘但是只保留低位在结果中;

减少浮点乘法的精度损失:instead of returning round(round(a * b) + c), they return round(a * b + c)

_mm256_permute_ps:把1个256位的8个float打散放到1个256位的8个float结果中;

_mm256_shuffle_ps   :把2个256位的一共16个float打散挑8个放到1个256位的8个float结果中;

向量reduce的例子

(我们Conv-DSSM的3个向量加和,根本不需要reduce的!我们只用了_mm256_add_ps做3个向量加和和_mm256_max_ps做词组向量max-pooling

reduce函数是AVX512才支持的!AVX2不支持!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵乘法是一个常见的运算任务,可以通过串行算法、catch优化、SSE/AVX版本和分片策略来实现。下面分别介绍这四种实现方法。 1. 串行算法: 串行算法是最基本的矩阵乘法实现方式。通过两层循环遍历矩阵A和矩阵B的每个元素,计算对应位置的乘积再求和,得到结果矩阵C的对应元素。该过程的时间复杂度为O(n^3),其中n为矩阵的维度。 2. Catch优化: Catch优化是一种优化矩阵乘法性能的方法。它利用计算机CPU的高速缓存(Cache)来提高运算速度。通过分块矩阵乘法,将原始矩阵按照一定的块大小划分成多个小块,然后逐个计算小块相乘的结果。在计算过程中,尽量利用Cache的特性,减少Cache的命中次数,从而降低内存访问的开销。 3. SSE/AVX版本: SSE(SIMD Streaming Extensions)和AVX(Advanced Vector Extensions)是一些现代CPU的指令集扩展,支持同一时间进行多个并行计算。在矩阵乘法中,可以利用SSE/AVX指令集来对矩阵的一部分进行并行计算,从而提高计算效率。 4. 分片策略: 分片策略是将矩阵按照行或列进行划分,将矩阵乘法任务分片分配给多个线程或进程并行计算。每个线程或进程处理一个或多个分片,最后将计算结果汇总得到最终的结果矩阵。通过多线程或多进程的方式,可以充分利用多核计算机的并行计算能力,加快矩阵乘法的速度。 以上四种实现方式都可以在各自的环境下进行运行。具体执行过程可以根据不同的编程语言和平台来实现。主要考虑到矩阵的大小和硬件平台的特点,选择适合的实现方式来获得最佳的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值