标签:__ mm256 AVX set1 计算 量化 extract epi8
SSE && AVX 寄存器
SSE 和 AVX 每个都有16个寄存器,SSE 的有 XMM0 ~ XMM15,AVX 有 YMM0 ~ YMM15,XMM都是128 bit的,avx都是 256 bit的
SSE 有三种类型定义 _m128
,__m128d
,__m128i
,float,double,int
AVX 是 __m256
,__m256d
,__m256i
__m128
,__m128d
,__m256
,__m256d
比较简单,里面都是相同的float/double,编程的时候把里面当成float/double的数组基本就可以了,但是__m128i
和__m256i
有点特殊,举个例子就是 __m128
可以看成2个int64_t
或者4个int32_t
或者8个 int16_t
或者16个int8_t
需要用_mm256_extract_epiXX
取出来需要的类型。
__m256 fltx16 = _mm256_set1_ps(3.14f); // Create a vector with all elements equal to 3.14
fltx16[0] = 1.32f;
float f = fltx16[1];
__m256i int32x8 = _mm256_set1_epi32(0x3355ff);
int i = _mm256_extract_epi32(int32x8, 0); // value == 0x003355ff
int16_t i = _mm256_extract_epi32(int32x8, 0) // value == 0x55ff
一些内置函数:
SSE/AVX 指令的格式通常都是这样的:
_<vector_size>_<intrin_op>_<suffix>
对于浮点类型来讲,加减乘除都有对应的向量化函数指令
但是对于整形来说,除法就比较尴尬了,除法一般用libdevide
来实现,另外对于int16来说,溢出表现跟非向量计算的表现不一样。
auto res0 = _mm256_adds_epi8(_mm256_set1_epi8( 100 ), _mm256_set1_epi8( 100 ));
int16_t v = _mm256_extract_epi8(res0, 0); // value == 127
但是还有其他指令,可以处理溢出的情况 (avx2)
auto res0 = _mm256_add_epi8(_mm256_set1_epi8( 100 ), _mm256_set1_epi8( 100 ));
int8_t v = _mm256_extract_epi8(res0, 0); // value == -56
load 和 store
float fary[4];
__m128 f = _mm_loadu_ps(fary);
_mm_storeu_ps(fary, f);
reference
https://software.intel.com/sites/landingpage/IntrinsicsGuide
标签:__,mm256,AVX,set1,计算,量化,extract,epi8 来源: https://www.cnblogs.com/stdpain/p/14589375.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。