最快确定SIMD比较寄存器位置的方法

时间:2018-05-24 07:14:22

标签: c++ x86 sse simd avx

我已经将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);

0 个答案:

没有答案