我试图让以下代码运行,但结果始终为零。我错过了什么?
const int simd_compare_string_mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_NEGATIVE_POLARITY | _SIDD_BIT_MASK;
static const unsigned char wtf1[16] = "thisisatesttestt";
static const unsigned char wtf2[16] = "dacb";
const __m128i simd_a = _mm_loadu_si128((__m128i *)&wtf1[0]);
const __m128i simd_b = _mm_loadu_si128((__m128i *)&wtf2[0]);
int result = _mm_cmpestri(simd_b, 4, simd_a , 16, simd_compare_string_mode);
我真的不明白结果是来自第一个输入(在这种情况下是变量simd_b)还是来自第二个输入(simd_a)。我在上面的例子中想到,我可能得到一些东西(结果= 7或2?),表明' a'是两个字符串。
答案 0 :(得分:1)
事实证明,关键问题在于理解第一个和第二个字符串的角色,并且还意识到我不是在寻找匹配的索引,而是在匹配之前消耗的字符数。
我的目标是确定字符串是否包含某些字符。更具体地说,我正在尝试在解析文件时跳过空格,而我想知道的是在到达非空格字符之前我需要前进多远。
考虑到这一目标,以及我选择的选项(通过第5个输入或模式),这是我对输入的解释。
第一个输入字符串是您可以匹配的字符列表。第二个输入字符串是包含未知内容的字符串。输出是在第二个字符串中的字符不在第一个字符串中之前可以消耗的字符数。在上面的例子中答案是0,因为' t'不在" dacb。"
这是另一个代码段:
//This seems to be our dictionary
static const unsigned char wtf1[16] __attribute__((aligned(16))) = "1234567890123456";
//This seems to be the one that gives the index
static const unsigned char wtf2[16] __attribute__((aligned(16))) = "01d45678901234bc";
const __m128i simd_a = _mm_loadu_si128((__m128i *)&wtf1[0]);
const __m128i simd_b = _mm_loadu_si128((__m128i *)&wtf2[0]);
int result = _mm_cmpestri(simd_a, 16, simd_b , 4, simd_compare_string_mode);
在这个例子中,我们的结果是2,因为第二个输入中的前两个字符(&#34; 01&#34;)在第一个字符串中。 &#39; d&#39;不是。此函数允许指定字符串的长度。如果我使字符串相同,结果是4,因为我的第二个输入是&#34;限制&#34;至4个字符(上述功能中的第4个输入)。有趣的是看到它(在速度方面)与_mm_cmpistri(注意&#39; i&#39;而不是&#39; e&#39;)之间的比较(不包括字符串长度参数)。< / p>