我有以下代码旨在使用 c++ 中的流式 SIMD 扩展通过数组执行线性搜索:
#include <iostream>
#include <emmintrin.h>
using namespace std;
bool sse2_search_array(int* arr, int size, int key) {
int iterations;
if (size % 16 == 0) {
iterations = size / 16;
}
else {
iterations = size / 16 + 1;
}
__m128i* arr_ = reinterpret_cast<__m128i*>(arr); /*Cast to corresponding int type for 128 bit registers. Each __m128i
occupies 8 bits, so 16 integers can be processed simultaneously.*/
__declspec(align(16)) int key_arr[16];
fill_n(key_arr, 16, key); /*fill key array with 16 keys (for SSE comparisons)*/
__m128i* key_arr_ = reinterpret_cast<__m128i*>(key_arr);
int result;
/*Actual search begins here.*/
for (int i = 0; i < iterations; i++, arr_++) {
result = _mm_movemask_epi8(_mm_cmpeq_epi8( *key_arr_, *arr_)); /*Comparison of 2 16 bit arrays simultaneously.*/
cout << "result: " << result << endl;
if (result != 0) { return true; }
}
return false;
}
int main() {
__declspec(align(16)) int example_array[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
cout << "found: " << sse2_search_array(example_array, 16, 128);
cin.get();
}
它可以工作,但主函数中的示例应该返回 false,因为 128 不在example_array
,但sse2_search_array
似乎总是返回 true,result
示例中的值为 1110111011101110b 或 61166,这对我来说没有意义,因为我期待它为0。那么有人可以告诉我问题是什么以及如何解决它吗?我对 C++ 不是很有经验,对 SSE 知之甚少。