我有两个__m256i向量(每个包含字符),我想知道它们是否完全相同.我需要的只是true所有位都相等,0否则.
这样做最有效的方法是什么?这是加载数组的代码:
char * a1 = "abcdefhgabcdefhgabcdefhgabcdefhg";
__m256i r1 = _mm256_load_si256((__m256i *) a1);
char * a2 = "abcdefhgabcdefhgabcdefhgabcdefhg";
__m256i r2 = _mm256_load_si256((__m256i *) a2);
Run Code Online (Sandbox Code Playgroud)
当前Intel和AMD CPU上最有效的方法是对等式进行元素比较,然后检查所有元素的比较是否正确.
这编译成多个指令,但它们都很便宜(如果你在结果上分支)比较+分支甚至宏融合成一个uop.
#include <immintrin.h>
#include <stdbool.h>
bool vec_equal(__m256i a, __m256i b) {
__m256i pcmp = _mm256_cmpeq_epi32(a, b); // epi8 is fine too
unsigned bitmask = _mm256_movemask_epi8(pcmp);
return (bitmask == 0xffffffffU);
}
Run Code Online (Sandbox Code Playgroud)
产生的asm应该是vpcmpeqd / vpmovmskb / cmp 0xffffffff / je,在Intel CPU上只有3 uop.
vptest是2个微指令并且不宏观保险丝jcc,所以等于或大于更糟movmsk/ cmp测试的填充比较的结果.(见http://agner.org/optimize/
| 归档时间: |
|
| 查看次数: |
1655 次 |
| 最近记录: |