草庐IT

c++ - 寻找非立即移位值的 sse 128 移位操作

内在的_mm_slli_si128将对128位寄存器进行逻辑左移,但仅限于立即移位值,并且按字节而不是位进行移位。我可以使用像_mm_sll_epi64或_mm_sll_epi32这样的内在函数来左移__m128i寄存器中的一组值,但这些不会携带“溢出”位。对于N位的移位,想象一下我可以执行以下操作:_mm_sll_epi64_mm_srr_epi64(对于我要携带的位:将它们移到低位)随机播放srr结果或者这些一起。(但可能还必须包括对N相对于64的检查)。有没有更好的办法? 最佳答案 不是您理想的解决方案,但如果您想将SSE寄存

c++ - 寻找非立即移位值的 sse 128 移位操作

内在的_mm_slli_si128将对128位寄存器进行逻辑左移,但仅限于立即移位值,并且按字节而不是位进行移位。我可以使用像_mm_sll_epi64或_mm_sll_epi32这样的内在函数来左移__m128i寄存器中的一组值,但这些不会携带“溢出”位。对于N位的移位,想象一下我可以执行以下操作:_mm_sll_epi64_mm_srr_epi64(对于我要携带的位:将它们移到低位)随机播放srr结果或者这些一起。(但可能还必须包括对N相对于64的检查)。有没有更好的办法? 最佳答案 不是您理想的解决方案,但如果您想将SSE寄存

c++ - 使用 SIMD 查找表

我有一个大像素处理函数,我目前正在尝试使用内部函数进行优化。作为SSE新手,我不知道如何处理涉及查找表的代码部分。基本上,我正在尝试对以下vanillaC++代码进行矢量化://outsideloopconstfloatLUT_RATIO=1000.0F;//inloopfloatv=...//inputvaluev=myLookupTable[static_cast(v*LUT_RATIO)];我正在尝试什么://outsideloopconst__m128LUT_RATIO=_mm_set1_ps(1000.0F);//inloop__m128v=_mm_set_ps(v1,v2,

c++ - 使用 SIMD 查找表

我有一个大像素处理函数,我目前正在尝试使用内部函数进行优化。作为SSE新手,我不知道如何处理涉及查找表的代码部分。基本上,我正在尝试对以下vanillaC++代码进行矢量化://outsideloopconstfloatLUT_RATIO=1000.0F;//inloopfloatv=...//inputvaluev=myLookupTable[static_cast(v*LUT_RATIO)];我正在尝试什么://outsideloopconst__m128LUT_RATIO=_mm_set1_ps(1000.0F);//inloop__m128v=_mm_set_ps(v1,v2,

c++ - 为什么 SSE 有 128 位加载功能?

我正在查看其他人的代码,目前正试图找出_mm_load_si128存在的原因。基本上,我尝试替换_ra=_mm_load_si128(reinterpret_cast(&cd->data[idx]));与_ra=*reinterpret_cast(&cd->data[idx]);它的工作原理和执行完全相同。我认为加载函数只是为了方便而存在于较小的类型中,这样人们就不必手动将它们打包到连续内存中,但是对于已经按正确顺序排列的数据,何必呢?_mm_load_si128还有其他功能吗?或者它本质上只是一种迂回的赋值方式? 最佳答案 SSE

c++ - 为什么 SSE 有 128 位加载功能?

我正在查看其他人的代码,目前正试图找出_mm_load_si128存在的原因。基本上,我尝试替换_ra=_mm_load_si128(reinterpret_cast(&cd->data[idx]));与_ra=*reinterpret_cast(&cd->data[idx]);它的工作原理和执行完全相同。我认为加载函数只是为了方便而存在于较小的类型中,这样人们就不必手动将它们打包到连续内存中,但是对于已经按正确顺序排列的数据,何必呢?_mm_load_si128还有其他功能吗?或者它本质上只是一种迂回的赋值方式? 最佳答案 SSE

c++ - 获取 __m256 变量中不为零的第一个元素的索引

__m256dst=_mm256_cmp_ps(value1,value2,_CMP_LE_OQ);如果dst是[0,0,0,-nan,0,0,0,-nan];我希望能够知道第一个-nan索引,在本例中为3而无需使用8迭代进行for循环。这可能吗? 最佳答案 我愿意movmskps比较的结果然后做一个bitscanforward.使用内在函数(这适用于gcc/clang,参见hereforalternatives):intpos=__builtin_ctz(_mm256_movemask_ps(dst));注意,如果没有设置位,bs

c++ - 获取 __m256 变量中不为零的第一个元素的索引

__m256dst=_mm256_cmp_ps(value1,value2,_CMP_LE_OQ);如果dst是[0,0,0,-nan,0,0,0,-nan];我希望能够知道第一个-nan索引,在本例中为3而无需使用8迭代进行for循环。这可能吗? 最佳答案 我愿意movmskps比较的结果然后做一个bitscanforward.使用内在函数(这适用于gcc/clang,参见hereforalternatives):intpos=__builtin_ctz(_mm256_movemask_ps(dst));注意,如果没有设置位,bs

c++ - 压缩一个十六进制数

是否有一种巧妙的(即:无分支)方法来“压缩”十六进制数。基本上把所有的0都移到一边?例如:0x10302040->0x13240000或0x10302040->0x00001324我看了BitTwiddlingHacks但什么也没看到。适用于SSE数值旋转算法。我需要删除任何变为0的枢轴。我可以使用_mm_cmpgt_ps找到好的枢轴,_mm_movemask_ps将其转换为掩码,然后进行一些黑客攻击以获得类似的东西以上。十六进制值被混入_mm_shuffle_ps指令的掩码中,以对SSE128位寄存器执行置换。 最佳答案 计算_p

c++ - 压缩一个十六进制数

是否有一种巧妙的(即:无分支)方法来“压缩”十六进制数。基本上把所有的0都移到一边?例如:0x10302040->0x13240000或0x10302040->0x00001324我看了BitTwiddlingHacks但什么也没看到。适用于SSE数值旋转算法。我需要删除任何变为0的枢轴。我可以使用_mm_cmpgt_ps找到好的枢轴,_mm_movemask_ps将其转换为掩码,然后进行一些黑客攻击以获得类似的东西以上。十六进制值被混入_mm_shuffle_ps指令的掩码中,以对SSE128位寄存器执行置换。 最佳答案 计算_p