SIMD: сравнить две строки посимвольно и найти общее количество совпадений.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SIMD: сравнить две строки посимвольно и найти общее количество совпадений.

Сообщение Anonymous »

Я разрабатываю биоинформатический инструмент. Я заинтересован в применении SIMD для повышения его скорости. Учитывая две строки одинаковой длины, я хотел бы быстро подсчитать общее количество индексов, в которых две строки имеют одинаковые символы.
Например, предположим, что у нас есть 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]);
}
, который выводит 255 255 255 255 0 0 255 255 255 255 255
Итак, теперь у меня есть объект регистра __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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»