Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 寻找C+中的短值+;阵列快速SIMD版本_C++_Simd - Fatal编程技术网

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);