C++ 寻找C+中的短值+;阵列快速SIMD版本
我的程序中有一个运行良好的算法。我推测是否有可能加快思考速度:C++ 寻找C+中的短值+;阵列快速SIMD版本,c++,simd,C++,Simd,我的程序中有一个运行良好的算法。我推测是否有可能加快思考速度: unsigned short c; bool found = false; unsigned short* arrIterator = arr; while(( c = *arrIterator & mask) != stopValue) { if(c == next) { found= true; break;
unsigned short c;
bool found = false;
unsigned short* arrIterator = arr;
while(( c = *arrIterator & mask) != stopValue)
{
if(c == next)
{
found= true;
break;
}
arrIterator ++;
}
可以将这种算法重写为SIMD指令吗?假设
arr
是16对齐的(这样做),您可以这样做(未测试)
然后,通过对
found\u mask
和迭代器当前值的一些内容进行位扫描,您可以告诉索引在哪里找到了next
。您能先将编译器配置为高优化级别吗?然后,您应该打印出汇编语言,以查看编译器是否生成SIMD指令。此外,请尝试使用数组表示法而不是指针。通常,指针只指向一个值。数组表示有多个值,且这些值是连续的。您能保证包含停止值的对齐16字节块在停止值之后没有一个等于next
的值吗?是,我可以添加几个停止值来解决这个问题。我检查了ASM,编译器没有生成SIMD以获得高优化级别。编译器如何确保数组正确对齐?停止值是否存在多次?或者我可以帮助告诉编译器数组总是对齐的,并且在停止值之后找不到该值吗?我想我需要像下面的示例那样手动编写这段代码。
__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);