查找下一个 Ascii Space,_mm_cmpeq_epi8 返回 0
Finding Next Ascii Space With _mm_cmpeq_epi8 Returning 0
我将这个字符串传递到我的解析路由方法中。
route_start = 4;
parse_route_simd("GET /0000_0000_/ HTTP/1.1\r\n", 27);
assert(route_end == 15);
const char spaces[17] __attribute__((aligned(16))) = " [=13=]";
void parse_route_simd(const char *buffer, const int buffer_len) {
int index_simd;
int curr_index = route_start;
register __m128i xmm0, xmm1, xmm2;
register unsigned int eax;
register unsigned char ebx;
while (buffer_len - curr_index >= 16) {
debug_print("route_start %d\nindex_simd %d\nbuff %s\nspaces :%s:\n",
route_start, index_simd, buffer + curr_index, spaces);
xmm0 = _mm_loadu_si128((const __m128i *)buffer + curr_index);
xmm1 = _mm_loadu_si128((const __m128i *)spaces);
xmm2 = _mm_cmpeq_epi8(xmm0, xmm1);
eax = _mm_movemask_epi8(xmm2);
debug_print("eax %d\n", eax);
index_simd = __builtin_ffsll(eax);
我快疯了,因为我不明白为什么这段代码中的 eax 返回 0;
(const __m128i *)buffer + curr_index
是个问题。
您需要 (const __m128i *)(buffer + curr_index)
进行 char*
地址计算, 然后 转换为 __m128i*
.
强制转换的运算符优先级高于 +
。
另一个避免这个错误的常用技巧是(__m128i*) &buffer[curr_index]
调试器应该显示使用 curr_index = 1
,您正在从 16 个字节加载到数组中,向前移动一个 __m128i
,因为这是加法中涉及的指针类型。
我将这个字符串传递到我的解析路由方法中。
route_start = 4;
parse_route_simd("GET /0000_0000_/ HTTP/1.1\r\n", 27);
assert(route_end == 15);
const char spaces[17] __attribute__((aligned(16))) = " [=13=]";
void parse_route_simd(const char *buffer, const int buffer_len) {
int index_simd;
int curr_index = route_start;
register __m128i xmm0, xmm1, xmm2;
register unsigned int eax;
register unsigned char ebx;
while (buffer_len - curr_index >= 16) {
debug_print("route_start %d\nindex_simd %d\nbuff %s\nspaces :%s:\n",
route_start, index_simd, buffer + curr_index, spaces);
xmm0 = _mm_loadu_si128((const __m128i *)buffer + curr_index);
xmm1 = _mm_loadu_si128((const __m128i *)spaces);
xmm2 = _mm_cmpeq_epi8(xmm0, xmm1);
eax = _mm_movemask_epi8(xmm2);
debug_print("eax %d\n", eax);
index_simd = __builtin_ffsll(eax);
我快疯了,因为我不明白为什么这段代码中的 eax 返回 0;
(const __m128i *)buffer + curr_index
是个问题。
您需要 (const __m128i *)(buffer + curr_index)
进行 char*
地址计算, 然后 转换为 __m128i*
.
强制转换的运算符优先级高于 +
。
另一个避免这个错误的常用技巧是(__m128i*) &buffer[curr_index]
调试器应该显示使用 curr_index = 1
,您正在从 16 个字节加载到数组中,向前移动一个 __m128i
,因为这是加法中涉及的指针类型。