首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何双倍地使用SSE2?

如何双倍地使用SSE2?
EN

Stack Overflow用户
提问于 2019-01-28 16:17:28
回答 1查看 498关注 0票数 3

float中,floor()int()似乎非常容易,例如:

代码语言:javascript
复制
float z = floor(LOG2EF * x + 0.5f);
const int32_t n = int32_t(z);   

变成:

代码语言:javascript
复制
__m128 z = _mm_add_ps(_mm_mul_ps(log2ef, x), half);
__m128 t = _mm_cvtepi32_ps(_mm_cvttps_epi32(z));
z = _mm_sub_ps(t, _mm_and_ps(_mm_cmplt_ps(z, t), one));

__m128i n = _mm_cvtps_epi32(z);

但是如何在double中使用仅使用 SSE2来实现这一点呢?

这是我想转换的双版本:

代码语言:javascript
复制
double z = floor(LOG2E * x + 0.5);
const int32_t n = int32_t(z);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-28 16:59:50

只需使用单精度(...ps...)内在特性的双精度等效(...ps...):

代码语言:javascript
复制
__m128i n = _mm_cvtpd_epi32(z);

根据英特尔Intrinsics指南,这个内在特性确实适用于SSE2:https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=4966,1917&techs=SSE2

__m128i _mm_cvtpd_epi32 (__m128d a)a中的填充双精度(64位)浮点元素转换为32位整数,并将结果存储在dst中。 J := 0 to 1 i := 32*j k := 64*j dsti+31:i := Convert_FP64_To_Int32(ak+63:k)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54406161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档