我已经将SIMD与__m128i
寄存器进行了比较,结果如下:
0, 0, -1, -1, 0, 0, 0, 0 // in shorts
0, -1, 0, 0 // in ints
获取位置的int的最快/最便宜的方法是什么? __m128i
内只有一个int设置为1。
示例:
-1, -1, 0, 0, 0, 0, 0, 0 -> 0
0, 0, -1, -1, 0, 0, 0, 0 -> 1
0, 0, 0, 0, -1, -1, 0, 0 -> 2
0, 0, 0, 0, 0, 0, -1, -1 -> 3
另外一个注意事项,我只有AVX和更低的可用,所以没有AVX2或AVX-512。我使用的是C ++和英特尔instrincs。
编辑:这是我目前的代码:
__m128i comparableLow = _mm_set_epi32(key - 1, key - 1, key - 1, key - 1);
__m128i comparableHigh = _mm_set_epi32(key + 1, key + 1, key + 1, key + 1);
__m128i mData = _mm_loadu_si128((__m128i*)(arr));
__m128i l1 = _mm_cmpgt_epi32(mData, comparableLow);
__m128i u1 = _mm_cmplt_epi32(mData, comparableHigh);
__m128i r1 = _mm_and_si128(u1, l1);