c++ - SIMD:逐个字符比较两个字符串并找到匹配的总数
问题描述
我正在开发一种生物信息学工具。我有兴趣应用 SIMD 来提高它的速度。给定两个长度相等的字符串,我想快速计算两个字符串具有相同字符的索引总数。
例如,假设我们有 S1="AATTGGCCAAC" 和 S2="AATTCTCCAAC"。然后,由于它们的长度为 11,并且仅在位置 5 和 6 处不同(S1 中的“GG”和 S2 中的“CT”),所以输出应该是 9。
这是我到目前为止所拥有的:
#include <string>
#include <immintrin.h>
using namespace std;
#include <memory.h>
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
所以现在我有一个名为 char_eq 的寄存器 __m128i 对象,其中包含有关每个字符是否匹配或不匹配的信息。如何将此 __m128i char_eq 对象转换为对匹配字符数进行编码的整数?我能想到的唯一方法是手动将布尔值相加(即 1+1+1+1+0+0+1+1+1+1+1),但这违背了使用 SIMD 的目的,因为那样会需要 length(str) 加法数。
查找两个字符串中匹配字符总数的最快方法是什么?我希望使它成为 O(1)。先感谢您!
解决方案
推荐阅读
- c# - 通过 ClickOnce 发布 WPF 应用程序时,引用项目的 .NET 5 TargetFramework 问题
- r - 通过excel文件R重命名数据框中的列
- javascript - 作用域如何在 for 循环中工作?让和未定义
- python - 如何在我的 txt 文件中存储一个值而不会消失
- r - 检索等价值
- python - 如何获取从函数返回的数据框的形状
- javascript - 如何使用 Python Selenium 调用 javascript 函数?
- oracle - 如何为 PL/SQL 中的 dbms 输出打印的值提供别名?
- hash - keccak256 不返回缓冲区
- python - Matplotlib:通过循环将图表保存在 1 个带有 TypeError 的 pdf 文件中:不可散列的类型:'list'