使用Intel Intrinsics调用_mm_cmpestrc时报无法转换为向量错误
问题原因
- 参数类型不匹配:
_mm_cmpestrc要求第1、3位传入的都是__m128i类型的128位向量,你直接将const char*类型的buffer指针作为第一个参数传入,编译器在执行宏定义里的(__m128i)(A)强制转换时,无法将指针类型转为向量类型,是本次报错的直接原因。 - Union使用逻辑错误:你定义的Union中将
__m128i和char*共享内存,给str成员赋值字符串常量的指针后,读取vec成员拿到的是字符串指针的地址值,而非"GET "四个字符本身的内容,就算参数类型修正后也得不到预期结果。 - 编译参数缺失:
_mm_cmpestrc是SSE4.2指令集对应的内置函数,你的CFLAGS中没有开启SSE4.2的编译选项,即使参数修正后也无法正常编译运行。
解决方案
- 修正向量构造逻辑:放弃错误的Union写法,直接用
_mm_setr_epi8构造存储"GET "的128位向量:
__m128i pattern = _mm_setr_epi8('G','E','T',' ', 0,0,0,0,0,0,0,0,0,0,0,0);
- 修正buffer参数传入:先将buffer中的内容加载为
__m128i类型向量再传入,注意如果buffer没有16字节对齐请用非对齐加载指令_mm_loadu_si128,操作前确保buffer至少可读16字节避免越界:
__m128i buf_vec = _mm_loadu_si128((const __m128i*)buffer); int has_value = _mm_cmpestrc(buf_vec, 4, pattern, 4, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH);
- 补充编译参数:在你的CFLAGS中添加
-msse4.2开启SSE4.2指令集支持:
CFLAGS = -Wall -O0 -std=c11 -g -msse4.2
内容的提问来源于stack exchange,提问作者Christopher Clark
相关产品推荐
相关产品推荐

