c 中 _mm_cmpestri 结果的问题
trouble with result from _mm_cmpestri in c
我正在尝试将以下代码获取到 运行,但结果始终为零。我错过了什么?
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' 在两个字符串中。
所以事实证明,关键问题在于理解第一个和第二个字符串的作用,并意识到我不是在寻找匹配项的索引,而是在匹配项之前消耗的字符数。
我的目标是确定一个字符串是否包含某些字符。更具体地说,我试图在解析文件时跳过空格,我想知道在到达非空格字符之前我需要前进多远。
考虑到这个目标,以及我选择的选项(通过第 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,因为我们第二个输入(“01”)中的前两个字符在第一个字符串中。 'd' 不是。此函数允许指定字符串的长度。如果我使字符串相同,则结果为 4,因为我的第二个输入是 "limited" 到 4 个字符(上述函数中的第 4 个输入)。看看这与不接受字符串长度参数的 _mm_cmpistri(注意 'i' 而不是 'e')相比如何(在速度方面)将会很有趣。
我正在尝试将以下代码获取到 运行,但结果始终为零。我错过了什么?
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' 在两个字符串中。
所以事实证明,关键问题在于理解第一个和第二个字符串的作用,并意识到我不是在寻找匹配项的索引,而是在匹配项之前消耗的字符数。
我的目标是确定一个字符串是否包含某些字符。更具体地说,我试图在解析文件时跳过空格,我想知道在到达非空格字符之前我需要前进多远。
考虑到这个目标,以及我选择的选项(通过第 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,因为我们第二个输入(“01”)中的前两个字符在第一个字符串中。 'd' 不是。此函数允许指定字符串的长度。如果我使字符串相同,则结果为 4,因为我的第二个输入是 "limited" 到 4 个字符(上述函数中的第 4 个输入)。看看这与不接受字符串长度参数的 _mm_cmpistri(注意 'i' 而不是 'e')相比如何(在速度方面)将会很有趣。