Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SIMD:逐字符比较两个字符串并找到匹配的总数_C++_Parallel Processing_Bioinformatics_Simd Library - Fatal编程技术网

C++ SIMD:逐字符比较两个字符串并找到匹配的总数

C++ SIMD:逐字符比较两个字符串并找到匹配的总数,c++,parallel-processing,bioinformatics,simd-library,C++,Parallel Processing,Bioinformatics,Simd Library,我正在开发一个生物信息学工具。我对应用SIMD来提高速度感兴趣。给定两个长度相等的字符串,我想快速计算两个字符串具有相同字符的索引总数 例如,假设我们有S1=“AATTGGCCAAC”和S2=“AATTCTCCAAC”。然后,由于它们的长度为11,并且仅在位置5和6(S1中的“GG”和S2中的“CT”)处不同,因此输出应为9 以下是我到目前为止的情况: #include <string> #include <immintrin.h> using namespace std

我正在开发一个生物信息学工具。我对应用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); 

}
,它输出255 255 0 255 255 255 255 255 255

现在我有了一个寄存器m128i对象,名为char_eq,它包含关于每个字符是否匹配的信息。如何将这个_m128i char_eq对象转换为对匹配字符数进行编码的整数? 我能想到的唯一方法是手动将布尔值相加(即1+1+1+1+0+0+1+1+1+1+1+1+1+1+1),但这与使用SIMD的目的背道而驰,因为这将需要长度(str)的相加次数


查找两个字符串中匹配字符总数的最快方法是什么?我希望能成功。提前谢谢你

请注意,
\u mm\u load\u si128
指针参数指向的数据。您可以计算
字符eq
中的设置位数,并将结果右移3(除以8)。相关问题:。它是一个典型的输入字符串,还是您计划让它在更大的字符串上运行?尺寸固定吗?如果没有,您在计算字符串之前知道字符串的大小吗?@DanielLangr_m128i最多需要16个字符,但我的字符串将小于16个字符(例如15个)。您共享的“快速计数…”中的代码适用于16个字符长的字符串,但对于较短的字符串,它不起作用,可能是因为_mm_cmpeq_epi8和其他函数操作在_m128i的位上,这些位没有被占用,因为输入字符串短于128位。如何处理此问题?@JWO因为字符串需要按16字节对齐,所以将其存储为16个字符长的字符串,并填充零/空字符(而不是
'0'
)。
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]);          
}