Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly XMM/YMM/ZMM中最小或最大元素索引的位旋转向导_Assembly_X86_Simd_Avx - Fatal编程技术网

Assembly XMM/YMM/ZMM中最小或最大元素索引的位旋转向导

Assembly XMM/YMM/ZMM中最小或最大元素索引的位旋转向导,assembly,x86,simd,avx,Assembly,X86,Simd,Avx,是否有指令或有效的无分支指令序列来计算无序(未排序)ZMM的最大(或最小)元素的索引(而不是值) 数据类型不重要——我更感兴趣的是知道是否有一个用于此的使用模式 已知解决方案的一个相关问题是,对于严格有序的ZMM,可以使用CMPP、MOVMSKPS和TZCNT来获取外部元素在该列表中的位置索引(即b搜索)除了没有水平最小值/最大值。phminposuw通过一些转换输入的工作可以给出最大值的位置,或有符号的最小或最大16位元素,但仅限16位元素。并且仅在低128位通道中;没有AVX2或AVX-5

是否有指令或有效的无分支指令序列来计算无序(未排序)ZMM的最大(或最小)元素的索引(而不是值)

数据类型不重要——我更感兴趣的是知道是否有一个用于此的使用模式



已知解决方案的一个相关问题是,对于严格有序的ZMM,可以使用CMPP、MOVMSKPS和TZCNT来获取外部元素在该列表中的位置索引(即b搜索)

除了没有水平最小值/最大值。phminposuw通过一些转换输入的工作可以给出最大值的位置,或有符号的最小或最大16位元素,但仅限16位元素。并且仅在低128位通道中;没有AVX2或AVX-512 YMM/ZMM version.IIRC,AARC64有一些适合各种元素大小的水平最小值/最大值,但x86没有。AFAIK最好的方法是洗牌/垂直最大日志(n)次,与水平和相同的减少模式:。然后比较位置的equal/movmsk/位扫描。(对于字节元素,您可以扩展为
phminposuw
)再次感谢您,Peter。我正在为最大值做同样的水平洗牌,但我不关心最大值的索引。最小值-我需要两者。我决定在一个“松散”(与“紧密”相反)的循环中进行检查,在这个循环中,分支将是我最不担心的(跨越互操作边界)