我的程序中有一个算法可以正常工作。我推测是否有可能加快思考:
unsigned short c;
bool found = false;
unsigned short* arrIterator = arr;
while(( c = *arrIterator & mask) != stopValue)
{
if(c == next)
{
found= true;
break;
}
arrIterator ++;
}
可以将这种算法重写为SIMD指令吗?
答案 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
的位置。