如何修改__m128i数据? [英] How to modify __m128i data?
本文介绍了如何修改__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屋!
查看全文