![]() |
1
3
您可以使用simd来完成它,但是它的速度将取决于您可用的指令集以及您在实现中的聪明程度。
一种方法是采用数组并“筛选”它来分离属于不同桶的元素。例如,从数组中获取32个字节,该数组将包含16个16位元素。使用一些
然后再重复一次以进行排序
从AVX2开始
this question
关于“压缩”操作的灵感。使用AVX512,您可以使用
您还可以尝试垂直方法,在其中加载n个向量,然后在它们之间进行交换,以便第0个向量具有最小的元素等。此时,您可以使用更优化的算法来压缩阶段(例如,)。如果垂直排序足够多的向量,则末端的向量可能完全从
最后,您还可以考虑以不同的方式组织您的数据,无论是在源代码处还是作为预处理步骤:分离出“类别”字节,该字节总是0-3的有效负载字节。许多处理步骤只需要在其中一个或另一个步骤上进行,因此您可以通过这种方式将它们分开来潜在地提高效率。例如,可以对所有类别的32个字节执行比较操作,然后对32个有效负载字节执行压缩操作(至少在最后一步中,每个类别都是唯一的)。 这将导致字节元素数组,而不是16位元素,其中“类别”字节是隐式的。您已经将数据大小减少了一半,这可能会加快将来处理数据所需的其他操作。
如果不能以这种格式生成源数据,则可以使用bucketing作为将有效负载放入正确bucket时移除标记字节的机会,因此输出为
(在AVX512BW之前,x86 SIMD没有任何变量控制字随机移动,只有字节或双字,因此您已经需要一个字节随机移动,它可以在将有效负载字节打包到底部的同时轻松地将有效负载与标记分开。) |