Например, предположим, что у нас есть S1="AATTGGCCAAC" и S2. ="AATTCTCCAAC". Затем, поскольку их длина равна 11 и различаются только в позициях 5 и 6 («GG» в S1 и «CT» в S2), на выходе должно быть 9.
Вот что я уже есть:
Код: Выделить всё
#include
#include
using namespace std;
#include
int main()
{
register __m128i str_A, str_B, char_eq;
str_A = _mm_load_si128((__m128i*)("AATTGGCCAAC"));
str_B = _mm_load_si128((__m128i*)("AATTCTCCAAC"));
char_eq = _mm_cmpeq_epi8(str_A, str_B);
}
Код: Выделить всё
uint8_t val[11];
memcpy(val, &char_eq, sizeof(val));
printf("Numerical: %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]);
}
Итак, теперь у меня есть объект регистра __m128i с именем char_eq, который содержит информацию о совпадают ли символы или не совпадают. Как превратить этот объект __m128i char_eq в целое число, которое кодирует количество совпадающих символов?
Единственный способ, который я могу придумать, - это вручную добавить логические значения (т. е. 1+1+1+1+0+0 +1+1+1+1+1), но это противоречит цели использования SIMD, поскольку для этого потребуется число сложений length(str).
Каков самый быстрый способ найти общее количество совпадающих символов в двух строках? Я надеюсь сделать это O(1). Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/671 ... of-matches