在C ++ Array快速SIMD版本中寻找短值

时间:2015-04-03 19:30:12

标签: c++ simd

我的程序中有一个算法可以正常工作。我推测是否有可能加快思考:

unsigned short c;   
bool found = false;
unsigned short* arrIterator = arr;
while(( c = *arrIterator & mask) != stopValue)
{       
    if(c == next)
    {               
        found= true;
        break;                  
    }
    arrIterator ++;
}   

可以将这种算法重写为SIMD指令吗?

1 个答案:

答案 0 :(得分:2)

假设arr是16对齐的(这样做),你可以做这样的事情(未经测试)

__m128i vstop = _mm_set1_epi16(stopValue);
__m128i vnext = _mm_set1_epi16(next);
int found_mask = 0;
int stop_mask = 0;
do
{
    __m128i data = _mm_load_si128(arrIterator++);
    __m128i contains_next = _mm_cmpeq_epi16(data, vnext);
    __m128i contains_stop = _mm_cmpeq_epi16(data, vstop);
    found_mask = _mm_movemask_epi8(contains_next);
    stopmask = found_mask | _mm_movemask_epi8(contains_stop);
} while (stopmask == 0);

然后,您可以通过对next执行位扫描以及使用迭代器的当前值的一些内容来告诉索引找到found_mask的位置。