小编Gol*_*oss的帖子

计算sse var最大掩码的最佳方法

(我只对前3个组件感兴趣)

例如:
[ 1 2 3 ? ]应该生产[ 0 0 -1 ? ]

此外,重要的是只设置一个"位",以便:
[ 1 2 2 ? ]不应该生产[ 0 -1 -1 ? ]
,而是(
[ 0 -1 0 ? ]或者[ 0 0 -1 ? ]无关紧要)

后来(坏)解决方案是可能的,例如通过提取水平最大值并与原始比较:

__m128 abcd; // input
__m128 ccac           = _mm_shuffle_ps(abcd, abcd, 0x8A);
__m128 abcd_ccac      = _mm_max_ps(abcd, ccac);
__m128 babb           = _mm_shuffle_ps(abcd, abcd, 0x51);
__m128 abcd_ccac_babb = _mm_max_ps(abcd_ccac, babb);
__m128 mask           = _mm_cmpeq_ps(abcd, abcd_ccac_babb);
Run Code Online (Sandbox Code Playgroud)

也许一些按位操作摆脱重复的设置位?

更新:

跟进,我做了另一个(坏)解决方案.
关键是要将每个组件与另一个组件进行比较,避免使用等式(没有 …

c++ x86 assembly sse bit-manipulation

6
推荐指数
1
解决办法
443
查看次数

排序分量多值(SIMD)数组

我正在尝试找到一种O(n?log(n))排序方法来同时对多个数组进行排序,以便多值数组中的元素将表示来自4个不同单值数组的元素,并且排序方法将对多值元素进行排序.

例如:
对于一个给定4个单值阵列An,Bn,CnDn,我会设置一个新的数组Qn
,使得Q? = [ A? B? C? D? ].
Q?可以在该过程中改变,使得Q? = [ Aa? Bb? Cc? Dd? ]
其中a?,b?,c?d?是索引列表
,当然这Q? ? Q??? = [ Aa??? Bb??? Cc??? Dd??? ]使得Aa? ? Aa???,Bb? ? Bb???等等.当然,动机是使用SIMD intructions从这个结构中受益,以分别对4个数组进行排序.

我尝试使用SIMD比较器(_mm_cmplt_ps例如)和掩码交换(_mm_blendv_ps例如)来制作传统排序算法的修改版本(快速排序,堆排序,合并排序等)但我总是遇到理论上出现的问题成为O(n?log(n))决策树中的步骤.因此,决定是否设置枢轴(快速排序)或者是否要将父项与其中一个子项交换(堆排序)对于所有整个4个组件同时是不正确的(并且因此,下一步 - 向右或向左 - 是不正确的).

现在我只有O(n²)方法工作.

有任何想法吗?

sorting algorithm sse simd time-complexity

2
推荐指数
1
解决办法
449
查看次数