加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – float4 :: set_wxy(以及其他set-swizzle ops)的更好的SSE2

发布时间:2020-12-16 07:00:39 所属栏目:百科 来源:网络整理
导读:我正在使用SSE2 / AVX内在函数在C中编写符合HLSL float4的类型,目前我正在实现HLSL中所有可用于float4的set-swizzle操作.我正在试图找出一个最佳的SSE2实现来处理涉及(swizzle)设置2或3组件的set-swizzle操作(因为4组件set-swizzle对于一个SSE shuffle op来
我正在使用SSE2 / AVX内在函数在C中编写符合HLSL float4的类型,目前我正在实现HLSL中所有可用于float4的set-swizzle操作.我正在试图找出一个最佳的SSE2实现来处理涉及(swizzle)设置2或3组件的set-swizzle操作(因为4组件set-swizzle对于一个SSE shuffle op来实现是微不足道的).例如,我无法想出一个更好的方法来实现说set_wxy而不至少4/5 SSE shuffle ops例如:

inline/__forceinline void float4::set_wxy(const float4& x)
{
    float4 tmp2 = *this;
    tmp2.set_wxyz(x);                         // set_wxyz = 1 x _mm_shuffle_ps
    const __m128 xyw_tmp = tmp2.zxyw().data;  // zxyw() = 1 x _mm_shuffle_ps
    const __m128 z_tmp = zxyw().data;         // zxyw() = 1 x _mm_shuffle_ps
    tmp2 = _mm_move_ss(xyw_tmp,z_tmp);
    set_zxyw(tmp2);                           // set_zxyw() = 1 x _mm_shuffle_ps
}

如果不使用SSE2以外的操作,有没有人想要更好的实施?因为我知道SSE4 / AVX中的_mm_blend_ps,我将通过预处理器条件使用它,但我想支持至少一个仅限SSE2的代码路径.提前致谢!

编辑:此函数的行为示例如下:

float4 k(5,5,5);
k.set_wxy(float4(1,2,3,4));
// now k == (2,1)

基本上,set_wxy使用x,y,z的参数按此顺序设置w,x,y分量,保留原始z值.

解决方法

你试图效仿这一系列的HLSL,对吧?

vec2.wxy = vec1.xyz;

你可以通过使用_mm_shuffle_ps以某种有限的方式组合两个向量的事实来获得某个地方.这是我的抨击:

// xyzw is vec1,XYZW is vec2
__m128 xxZZ = _mm_shuffle_ps(vec1,vec2,_MM_SHUFFLE(2,0));
__m128 ZxZx = _mm_shuffle_ps(xxZZ,xxZZ,_MM_SHUFFLE(0,2));
__m128 yzZx = _mm_shuffle_ps(vec1,ZxZx,_MM_SHUFFLE(1,1));

vec2 = yzZx;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读