Intrinsics头文件与SIMD指令集、Visual Studio版本对应表!

Intrinsics头文件与SIMD指令集、Visual Studio版本对应表!

 

File

描述

VS

VisualStudio

intrin.h

All Architectures

8.0

2005

mmintrin.h

MMX intrinsics

6.0

6.0 SP5+PP5

xmmintrin.h

Streaming SIMD Extensions intrinsics

6.0

6.0 SP5+PP5

emmintrin.h

Willamette New Instruction intrinsics (SSE2)

6.0

6.0 SP5+PP5

pmmintrin.h

SSE3 intrinsics

9.0

2008

tmmintrin.h

SSSE3 intrinsics

9.0

2008

smmintrin.h

SSE4.1 intrinsics

9.0

2008

nmmintrin.h

SSE4.2 intrinsics.

9.0

2008

wmmintrin.h

AES and PCLMULQDQ intrinsics.

10.0

2010

immintrin.h

Intel-specific intrinsics(AVX)

10.0

2010 SP1

ammintrin.h

AMD-specific intrinsics (FMA4, LWP, XOP)

10.0

2010 SP1

mm3dnow.h

AMD 3DNow! intrinsics

6.0

6.0 SP5+PP5

 

如果大家在PC上做优化,使用SIMD指令来优化各种瓶颈函数,包含#include <nmmintrin.h> 这个头文件基本就全了,除非你可以使用AVX来优化!

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用NEON SIMD intrinsics方式实现4*4矩阵乘法的示例代码: ```c #include <arm_neon.h> int32_t a[4][4] = { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} }; int32_t b[4][4] = { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} }; int32_t c[4][4] = { 0 }; int32x4_t a_vec[4], b_vec[4], c_vec[4], tmp_vec[4]; for (int i = 0; i < 4; i++) { // 把a矩阵的一行转成4个int32x4_t类型 a_vec[i] = vld1q_s32(a[i]); for (int j = 0; j < 4; j++) { // 把b矩阵的一列转成4个int32x4_t类型 b_vec[j] = vld1q_s32(&b[j][0]); // 把c矩阵的对应元素转成4个int32x4_t类型 c_vec[j] = vld1q_s32(&c[i][j]); } for (int k = 0; k < 4; k++) { // 把a_vec[i]的第k个元素复制到4个int32x4_t类型的tmp_vec中 tmp_vec[0] = vsetq_lane_s32(vgetq_lane_s32(a_vec[i], k), tmp_vec[0], 0); tmp_vec[1] = vsetq_lane_s32(vgetq_lane_s32(a_vec[i], k), tmp_vec[1], 1); tmp_vec[2] = vsetq_lane_s32(vgetq_lane_s32(a_vec[i], k), tmp_vec[2], 2); tmp_vec[3] = vsetq_lane_s32(vgetq_lane_s32(a_vec[i], k), tmp_vec[3], 3); // 对应位置相乘并相加 c_vec[k] = vmlaq_s32(c_vec[k], b_vec[k], tmp_vec[k]); } for (int j = 0; j < 4; j++) { // 把c_vec[j]写回c矩阵的对应元素 vst1q_s32(&c[i][j], c_vec[j]); } } ``` 在NEON SIMD intrinsics方式中,我们使用了一些NEON指令,如`vld1q_s32`、`vsetq_lane_s32`、`vgetq_lane_s32`和`vmlaq_s32`等,来实现向量化操作,从而提高了计算效率。具体来说,我们首先将`a`矩阵的一行转成4个`int32x4_t`类型向量,然后将`b`矩阵的一列和`c`矩阵的对应元素都转成4个`int32x4_t`类型向量。接下来,我们对`a_vec[i]`的每个元素进行复制,并分别与`b_vec[k]`对应位置相乘并相加,得到`c_vec[k]`。最后,我们将`c_vec[j]`写回`c`矩阵的对应元素即可。 需要注意的是,NEON SIMD intrinsics的代码实现与不同的CPU架构和指令集有关,具体实现方式可能会有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值