C++性能优化系列——矩阵转置(五)Intrinsic函数详解

本文深入探讨了Intrinsic函数在矩阵转置中的应用,解析了洗牌指令如_mm_unpacklo_epi8和_mm_blend_epi16的功能,并介绍了缓存控制指令_mm_prefetch和_mm_clflush的工作原理。通过主动缓存技术,可以显著提高内存操作速度。

Intrinsic函数是编译器提供的函数接口,调用Intrinsic函数可以达到代替汇编的作用。本篇详细介绍矩阵转置功能需要使用的Intrinsic函数的具体含义。

函数解释来自Intel Intrinsics Guide
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#

洗牌指令

__m128i _mm_unpacklo_epi8 (__m128i a, __m128i b)

在这里插入图片描述

__m128i _mm_blend_epi16 (__m128i a, __m128i b, const int imm8)

在这里插入图片描述

__m128d _mm_permute_pd (__m128d a, int imm8)

在这里插入图片描述

缓存控制指令

void _mm_prefetch (char const* p, int i)

在这里插入图片描述

解释:从地址P处预取尺寸为cache line大小的数据缓存,参数i指示预取方式
(_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA,分别表示不同的预取方式)
T0 预取数据到所有级别的缓存,包括L0。
T1 预取数据到除L0外所有级别的缓存。
T2 预取数据到除L0和L1外所有级别的缓存。
NTA 预取数据到非临时缓冲结构中,可以最小化对缓存的污染。
如果在CPU操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝。 注 意,CPU对数据操作拥有绝对自由!使用预取指令只是按我们自己的想法对CPU的数据操作进行补充,有可能CPU当前并不需要我们加载到缓存的数据,这 样,我们的预取指令可能会带来相反的结果,比如对于多任务系统,有可能我们冲掉了有用的缓存。不过,在多任务系统上,由于线程或进程的切换所花费的时间相 对于预取操作来说太长了, 所以可以忽略线程或进程切换对缓存预取的影响。

void _mm_clflush (void const* p)

在这里插入图片描述

void _mm_stream_si128 (__m128i* mem_addr, __m128i a)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值