在这个小代码示例中:
__m128i twos = _mm_set_epi32(2,3,1,2);
__m128i foo = _mm_set_epi32(128,128,128,128);
__m128i shifted = _mm_srl_epi32(foo,twos);"shifted“充满了零,而我希望它包含四个32位整数,分别为32、16、64和32。我是不是使用了错误的内在机制?
发布于 2013-02-06 23:16:56
是的,您没有正确使用它。_mm_srl_epi32()的第二个参数指定了要将第一个参数移位的位数,但它并不是您所期望的矢量化参数,它允许您将每个32位整数移位不同的位数。相反,128位参数被截断为64位,结果计数用于确定要移位的位数;对第一个参数中的所有4个整数使用相同的移位量。在您的例子中,较低的64位是0x0000000100000010,它的计算结果是一个非常大的正数。这会导致foo的所有元素都被刷新为零,因为所有的位都被移出。
要找到每条指令的所有小细节,一个很好的地方是英特尔的AVX Programmer's Reference。尽管标题可能有些用词不当,但本文档包含英特尔C++编译器(通常也可在gcc及其它版本中使用)中提供的所有SSE/SSE2/.../AVX/AVX2指令及其内部功能的说明。在文档中搜索_mm_srl_epi32可以清楚地解释该指令到底做了什么。
https://stackoverflow.com/questions/14731442
复制相似问题