如何修改__m128i数据? [英] How to modify __m128i data?

查看:391
本文介绍了如何修改__m128i数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好。



我对SSE操作有疑问。



我有'm128i_i8 __m128i'的数据如下所示。

Hi all.

I have a question on SSE operations.

I have 'm128i_i8 of __m128i' data that have as following.

__m128i Mydata;
Mydata.m128i_i8[0] : 90
Mydata.m128i_i8[1] : 0
Mydata.m128i_i8[2] : 1
Mydata.m128i_i8[3] : 0
Mydata.m128i_i8[4] : 114
Mydata.m128i_i8[5] : 1
Mydata.m128i_i8[6] : 34
Mydata.m128i_i8[7] : 1
Mydata.m128i_i8[8] : 85
Mydata.m128i_i8[9] : 2
Mydata.m128i_i8[10] : 68
Mydata.m128i_i8[11] : 2
Mydata.m128i_i8[12] : 103
Mydata.m128i_i8[13] : 2
Mydata.m128i_i8[14] : 119
Mydata.m128i_i8[15] : 1





※问题1.

我可以转换数据如下as?



※ Question 1.
Can I convert data following as ?

__m128i result;
result.m128i_i8[0] : 90
result.m128i_i8[1] : 1
result.m128i_i8[2] : 114
result.m128i_i8[3] : 34
result.m128i_i8[4] : 85
result.m128i_i8[5] : 68
result.m128i_i8[6] : 103
result.m128i_i8[7] : 119
result.m128i_i8[8] : 0
result.m128i_i8[9] : 0
result.m128i_i8[10] : 0
result.m128i_i8[11] : 0
result.m128i_i8[12] : 0
result.m128i_i8[13] : 0
result.m128i_i8[14] : 0
result.m128i_i8[15] : 0





※问题2.

如果我有如下数据。



※ Question 2.
If I have as following data.

Mydata.m128i_i16[0] : 90
Mydata.m128i_i16[1] : 1
Mydata.m128i_i16[2] : 114
Mydata.m128i_i16[3] : 222
Mydata.m128i_i16[4] : 341
Mydata.m128i_i16[5] : 444
Mydata.m128i_i16[6] : 359
Mydata.m128i_i16[7] : 119





我可以转换如下吗?

(门槛值是255)





Can I convert as following?
(Threshold is 255)

__m128i result;
result.m128i_i8[0] : 90
result.m128i_i8[1] : 1
result.m128i_i8[2] : 114
result.m128i_i8[3] : 222
result.m128i_i8[4] : 255
result.m128i_i8[5] : 255
result.m128i_i8[6] : 255
result.m128i_i8[7] : 119
result.m128i_i8[8] : 0
result.m128i_i8[9] : 0
result.m128i_i8[10] : 0
result.m128i_i8[11] : 0
result.m128i_i8[12] : 0
result.m128i_i8[13] : 0
result.m128i_i8[14] : 0
result.m128i_i8[15] : 0





我的代码:



My code:

__m128i result = _mm_setzero_si128();
result = _mm_packs_epi16(Mydata,_mm_setzero_si128());





请告诉我。谢谢。 :)



我尝试了什么:



我试过用'_mm_packs_epi16'操作但结果很奇怪。



Please advise me. Thank you. :)

What I have tried:

I tried to use '_mm_packs_epi16' operation but result is strange.

推荐答案

据我所知,没有SSE指令可以打包而不用饱和。但我肯定不是SSE2的专家。



请参阅Microsoft网站上的SSE2参考:



使用流式SIMD扩展2的整数内在函数 [ ^ ]



当然,您可以使用传统指令来完成您想要的任务。只需将128位项的内存表示形式视为字节数组,然后在一个小循环中进行打包。这只是两行代码,如果你不那么广泛,它将不会比SSE2指令慢得多。
To my knowledge there is no SSE instruction that does the packing without saturation. But I am admittedly no expert at SSE2.

See here for the SSE2 reference on the Microsoft website:

Integer Intrinsics Using Streaming SIMD Extensions 2[^]

Of course you can use conventional instruction to accomplish what you want. Just treat the memory representation of your 128-bit item as byte array and do the packing in a little loop. That's just two lines of code and if you don't do that extensively it will be not that much slower than an SSE2 instruction.


这篇关于如何修改__m128i数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆