Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SIMD内部函数对数组排序_C++_Intrinsics - Fatal编程技术网

C++ 使用SIMD内部函数对数组排序

C++ 使用SIMD内部函数对数组排序,c++,intrinsics,C++,Intrinsics,在SIMD指令集中,可以对数组进行从小调到市长的排序。输入数组如下所示: uint32_t * vector = [1968593, 104757, 3065928, 657065, 3098046, 3113981, 1584192, 2464900]; __m256i regData; regData = _mm256_loadu_si256( (__m256i *) (vector) ); //SORT ARRAY WITH INSTRINSICS _mm256_storeu_si2

在SIMD指令集中,可以对数组进行从小调到市长的排序。输入数组如下所示:

uint32_t * vector = [1968593, 104757, 3065928, 657065, 3098046, 3113981, 1584192, 2464900];
__m256i regData;
regData = _mm256_loadu_si256( (__m256i *) (vector) );

//SORT ARRAY WITH INSTRINSICS


_mm256_storeu_si256( (__m256i) vector, regData );

//SHOW DATA SORTED
// [104757, 657065, 1584192, 1968593, 2464900, 3065928, 3098046, 3113981]

我正试图用m256i数据寄存器来解决这个问题,但我仍然找不到解决这个问题的方法

我怎么做


PD:这是我第一次尝试SIMD,可能我使用了错误的术语。

是的,您可以使用批处理程序偶数/奇数合并排序或任何其他排序网络。诀窍是找到适合给定CPU体系结构中有限数量的可用置换的最佳网络。在这种情况下,限制因素是无法使用快速银行间置换——也就是说,如何找到将所有元素0到7中的元素组合在一起的一般置换,而不仅仅是将元素0to3和4to7中的元素组合在一起,在两个银行上发生相同的置换

另一种方法是使用插入排序,对simd寄存器进行预排序,并将每个新元素逐个添加到其中。


我已经成功地将此技术用于XMM寄存器中的uint16\t元素。但在AVX2中,这种技术也存在银行间排列问题,因为输入需要在银行间移动。

你不认为SIMD真的意味着单指令多数据吗?我认为它可以与各种SIMD一起使用,但我不知道如何做到。这是可能的,但不是一个“好”问题,不管怎么说,你只是要求我们写代码,谷歌对
avx2排序无符号整数
的第一次点击(除了问答)是;我没有读整篇文章,但大概是使用了shuffles和
vpminud
/
vpmaxud
对成对或单个向量进行排序。
 shifted = shift_all_element_left_one_element(sorted);
 shifted = max(shifted, new_element_to_be_inserted__broadcast);
 sorted = min(sorted, shifted);