Использование SSE4.2 инструкции PCMPESTRM с небольшими паттернами

Я пытаюсь использовать некоторые инструкции SSE4.2 в алгоритмах сопоставления строк, написанных на c ++.

Я не понимаю, как использовать эти инструкции, чтобы соответствовать меньшим образцам, и надеялся, что кто-нибудь может помочь мне с этим.

В примере кода я пытаюсь найти шаблон «муравей» в упакованной строке «я антилопа». Я надеюсь, что результатом будет маска, установленная для всех нулей, кроме 1 в индексе 8.

Теперь это мой код, в котором #include для nmmintrin.h включает инструкции sse4.2:

void print128_num(__m128i var)
{
uint8_t *val = (uint8_t*) &var;
printf("Text: %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i \n",
val[0], val[1], val[2], val[3], val[4], val[5],
val[6], val[7], val[8], val[9], val[10], val[11],
val[12], val[13], val[14], val[15]);
}

int main(){

__m128i s = _mm_set_epi8('e','p','o','l','e','t','n','a',' ','n','a',' ','m','a',' ','i');
__m128i p = _mm_set_epi8(0,0,0,0,0,0,0,0,0,0,0,0,0,'t','n','a');

print128_num(s);
print128_num(p);

__m128i res =  _mm_cmpestrm(s, 16, p, 3, 0);
print128_num(res);

return 0;
}

Я добавил все нули, потому что функция инициализации не допускает меньше аргументов. Я понимаю, что это неправильно, но не знал, как это сделать, и сделал несколько довольно отчаянных попыток.

В любом случае, вот как я скомпилировал: g ++ -g sse4test.cpp -o sse4test -std = c ++ 11 -msse4.2

и это мой вывод:

Text: 105 32 97 109 32 97 110 32 97 110 116 101 108 111 112 101
Text: 97 110 116 0 0 0 0 0 0 0 0 0 0 0 0 0
Text: 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

чего я не понимаю, правда. (последняя строка).

Любая помощь будет очень высоко ценится.

0

Решение

Есть две проблемы с вашим кодом. Во-первых, у вас есть источник и шаблон обратный в вызове _mm_cmpestrm, Во-вторых, вы указываете 0 для последнего аргумента, который представляет собой набор флагов, определяющих режим работы.

Режим нуля получается как _SIDD_CMP_EQUAL_ANY, описанный как For each character c in A, determine whether any character in B is equal to c.

Для поиска подстроки режим должен быть указан как _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_BIT_MASK,

Если вы сделаете эти изменения, то вы получите «0 1», или, другими словами, совпадение с 9-м символом.

Кстати: вы можете загрузить из строк, используя _mm_loadu_si128((__m128i*)(str)); Вместо того, чтобы использовать _mm_set_epi8,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]