使用序列间SIMD并行化加快Smith-Waterman数据库搜索
1,2,3 托比约恩·罗杰斯
1奥斯陆大学信息学系,挪威奥斯陆NO-0316 Blindern邮政信箱1080
2挪威奥斯陆大学医院Rikshospitalet微生物系分子生物学和神经科学中心(CMBN),邮政信箱4950 Nydalen,NO-0424 Oslo
3挪威奥斯陆NO-0319 Vinderen Sencel生物信息公司,邮政信箱180
1奥斯陆大学信息学系,挪威奥斯陆NO-0316 Blindern邮政信箱1080
2挪威奥斯陆大学医院Rikshospitalet微生物系分子生物学和神经科学中心(CMBN),邮政信箱4950 Nydalen,NO-0424 Oslo
3挪威奥斯陆NO-0319 Vinderen Sencel生物信息公司,邮政信箱180
通讯作者。 版权©2011 Rognes版权所有;被许可方BioMed Central Ltd。 - 补充资料
附加文件1源代码SWIPE 1.0版的源代码,以及64位Linux的二进制可执行文件和分数矩阵都包含在这个压缩的tar存档文件中。
GUID:05B4D65A-AD1D-48CB-A1BE-463929717C34
摘要
背景
用于局部序列比对的Smith-Waterman算法比用于数据库搜索的启发式方法更敏感,但也更耗时。Farrar在2007年曾描述过与SIMD技术并行的最快方法。这项研究的目的是探索是否可以通过其他并行化方法获得进一步的速度。
结果
描述了一种更快的方法和实现,并对其进行了基准测试。在新工具SWIPE中,将16个不同数据库序列的残差与一个查询残差进行并行比较。使用375个剩余查询序列,在双Intel Xeon X5650六核处理器系统上实现了每秒1060亿个单元更新(GCUPS)的速度,这比基于Farrar“条带化”方法的软件快六倍多。当程序只使用单个线程时,SWIPE的速度大约快2.5倍。对于较短的查询,速度的提高幅度较大。使用BLOSUM50得分矩阵时,SWIPE的速度大约是BLAST的两倍,而BLAST对于BLOSUM62矩阵来说,速度大约是SWIPE速度的两倍。该软件是为带有SSSE3的处理器上的64位Linux设计的。源代码可从获取http://dna.uio.no/swipe/根据GNU事务通用公共许可证。
结论
在标准硬件上使用SIMD的高效并行化使Smith Waterman数据库搜索的运行速度比以前快六倍以上。这里描述的方法可以显著拓宽Smith-Waterman搜索的潜在应用。其他需要最佳局部对齐分数的应用程序也可以从改进的性能中受益。
背景
两个生物序列的比对是一项基本操作,它构成了许多生物信息学应用程序的一部分,包括序列数据库搜索、多序列比对、基因组组装和短读图绘制。
史密斯和沃特曼[1]描述了一个需要O的简单通用算法(N个3)时间和O(N个2)使用替换得分矩阵和一般间隙惩罚函数识别最优局部序列比对得分的存储器。后藤[2]表明,使用仿射间隙惩罚,可以在O中计算出最佳局部对齐分数(N个2)时间和O(N个)内存。
当需要多次计算最佳比对分数时,例如当搜索序列数据库时,计算时间变得相当长。已经采取了几种方法来减少所需的时间。BLAST等启发式方法[3,4]速度要快得多,但不一定能找到最佳对齐方式。
以FPGA(现场可编程门阵列)形式的可重构硬件也可以加快对齐分数计算的速度。锂等[5]. 据报道,在最先进的FPGA板上,DNA序列的更新速度相当于每秒约238亿个细胞(GCUPS)。搜索速度通常在GCUPS中报告,它表示每秒处理的对齐矩阵中的十亿(giga)个单元格(查询序列长度乘以数据库剩余总数)。
该算法也可以在运行在更通用硬件上的软件中通过各种形式的并行来实现。独立序列的成对比对原则上是“令人尴尬的”并行,因为每对序列的计算是完全独立的。阿尔卑斯山等[6]. 建议通过将宽寄存器的位划分为几个较窄的单元,并使用指令分别对这些单元执行算术运算,并行执行几个独立的对齐分数计算,从而提高速度。随着MMX、SSE、SSE2、MAX、MVI、VIS和AltiVec等技术的引入,微处理器制造商后来使寄存器内的这种并行形式变得更加简单和容易,这些技术现在通常被称为SIMD技术。一些实现利用了英特尔处理器上的SSE2指令[7]. 跨多个数据库序列执行并行化的方法也称为任务间并行化,而任务内并行化是在一对序列中进行的。
自那时以来,人们的努力主要集中在一对序列的单一比对中的并行化上。图说明了主要方法。沃兹尼亚克[8]建议沿对齐矩阵中的小对角线并行计算单元,因为这些计算是独立的。罗杰斯和西伯格[9]发现尽管存在一些数据依赖性,但在查询序列中使用单元格的速度更快,因为沿着小对角线加载值太复杂了。法拉[10]引入了一种“条带化”方法,其中计算在几个单独的条带中并行执行,覆盖查询序列的不同部分,以减少一些计算依赖性的影响。Farrar的条带化方法通常是最快的,他报告称在四核和八核上的速度分别超过11和20个GCUPS[11]. 萨勒科夫斯基等[12]. 描述了使用Farrar条带化方法的SWPS3实现,声称在四核处理器上的速度高达15.7 GCUPS。不过,性能在很大程度上取决于查询长度。使用{“type”:“entrez protein”,“attrs”:{“text”:“P07327”,“term_id”:“113390”,“term_text”:“P07327”}P07327号查询序列中,典型的蛋白质长度为375个残基,SWPS3的性能大约为9 GCUPS。
Smith-Waterman路线矢量化方法。对齐矩阵以黑色、蓝色、红色、绿色和黄色表示,其中包含构成处理的前五个矢量的元素。为了简单起见,只显示了4个元素的向量,而通常使用16个元素。(A) 沃兹尼亚克描述的反对角线矢量等[8]. (B) Rognes和Seeberg描述的查询向量[9]. (C) Farrar描述的条带方法[10]. (D) Alpern描述的多序列向量等[6]. 在本文中。
由索尼、东芝和IBM生产的Cell处理器有一个主内核(Power Processing Element,PPE)和8个次内核(Synergistic Processing Elements,SPE)。这些核心具有SIMD向量处理功能。一些IBM服务器(QS20)和索尼PlayStation 3(PS3)(只有6个SPE可用)中都有手机处理器。已经描述了该处理器的几种实现。Szalkowski的SWPS3等[12]. 使用Farrar方法,并声称PS3的速度高达8 GCUPS。此外,性能高度依赖于查询长度。使用{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}P07327号查询序列,SWPS3在PS3上的性能小于2 GCUPS。维拉旺等[13]. 在他们的实现中也使用了Farrar方法,称为CBESW,并声称PS3上的速度超过3.6 GCUPS,而性能为2.2 GCUPS{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}P07327号查询序列。Farrar还报告说,使用相同的查询,IBM QS20上的速度为15.5 GCUPS,PS3上的速度高达11.6 GCUPS[11]. 鲁德尼茨基等[14]. 描述了在PS3上使用多个数据库序列并行化的实现,并报告了接近9个GCUPS的速度。
图形处理器(GPU)也可以加速校准。一些实现已将CUDA接口应用于Nvidia GPU。Liu的CUDASW++工具等[15]. 据报道,在单GPU GeForce GTX 280上执行了9.5 GCUPS,在双GPU GeForce GTX 295上执行了14.5 GCUPS。利戈夫斯基和鲁德尼基[16]据报道,双GPU GeForce 9800 GX2的速度高达14.5 GCUPS。2010年,刘等[17]. CUDASW++2.0在单GPU GeForce GTX 280和双GPU GeForce GTX 295上报告的速度分别高达17和30 GCUPS。最近,Ligowski等[18]. 报告GeForce GTX 480的速度为42.6 GCUPS。
任务间并行化方法的主要优点是按照Alpern的描述并行处理多个数据库序列等[6]. 它只是简单地避免了对齐矩阵中的所有数据依赖性。除了Rudnicki的工作外,这种方法在以后使用SIMD技术的实现中似乎没有太多研究等[14]. 然而,在基于GPU的工具中[15,16]这种方法很常见。本研究的目的是探索在普通CPU上进一步使用SIMD来使用此方法。
这里,该算法是在带有SSSE3的英特尔处理器上实现的[7]在多个数据库序列上进行并行化,如图所示不是一次将一个数据库序列与查询序列对齐,而是并行检索和处理多个数据库序列的残留物。从数据库序列中快速提取和组织数据使得这种方法可行。该方法已在一个名为SWIPE的工具中实现。该方法还包括计算数据库序列中的四个连续单元格,然后再进行下一个查询余数,以减少所需的内存访问次数。
使用不同的评分矩阵、差距惩罚、查询序列和线程数对新实现的性能进行了广泛测试。对于广泛的查询长度,在双Intel Xeon X5650六核处理器系统上,SWIPE的速度几乎恒定在100多个GCUPS。对于典型的长度查询,SWIPE比SWPS3和Farrar自己的实现快大约六倍,但系数在2到18之间变化,具体取决于查询长度和使用的线程数。对两种版本的BLAST进行了测试,发现其速度高度依赖于评分矩阵。使用BLOSUM50矩阵时,SWIPE的速度大约是BLAST的两倍,而使用BLOSUM62矩阵时,BLAST大约是SWIPE速度的两倍。
方法
标杆管理
对奥斯陆大学Titan高性能集群中的计算节点进行了基准测试。保留了整个节点,以确保没有其他主要进程正在运行。所有数据最初都复制到一个快速的本地磁盘,以减少计算机网络的影响,并将文件读取时间降至最低。所有程序的输出都被重定向到/dev/null,以最小化由于输出量造成的性能差异。所有程序组合、线程数、查询序列、得分矩阵、缺口开放惩罚和缺口扩展惩罚运行15次,并记录总挂钟执行时间的中位数。
软件
表列出了已进行基准测试的软件包,包括其版本号和使用的命令行选项。
表1
程序 | 版本 | 命令行 |
---|
爆炸 | 2.2.24 | ./blastall-p blastp-F F-C 0-b 0-v 10-a$T-M$M-G$GO -E$GE-i$Q-d$d |
爆炸+ | 2.2.24+ | ./blastp-段号-comp_based_stats F-num_allignments 0 -num_descriptions 10-num_threads$T-矩阵$M -gapopen$GO-gapextend$GE-查询$Q-db$D |
SWIPE(扫描) | 1 | ./swipe-v 10-a$T-M$M.mat-G$GO-E$GE-i$Q-d$d |
条纹 | | ./striped-c 10-T$T-i-$GO-e-$GE$M.mat$Q$D.fsa |
雨水处理厂3 | 20080605 | ./swps3-j$T-i-$GO-e-$GE$M.mat$Q$D.fsa |
SWIPE主要是用C++编写的,有些部分是用内联汇编程序手工编码的,有些则使用SSE2和SSSE3内部函数。它是使用英特尔C++编译器11.1版为64位Linux编译的。源代码位于http://dna.uio.no/swipe/根据GNU Affero通用公共许可证第3版。可执行二进制文件和分数矩阵文件也可在同一位置使用。相同的文件作为附加文件包含在gzipped tar存档中1.
Farrar的STRIPED软件的源代码是从作者的网站下载的,并按照提供的Makefile中的规定使用GNU gcc编译器进行编译[11]. Makefile也被修改为使用英特尔编译器编译STRIPED,以查看性能是否有任何差异。
SWPS3程序的二进制可执行文件从作者的网站下载并直接使用[12].
BLAST和BLAST+的预编译二进制文件从NCBI FTP站点下载[4].
使用Gnuplot 4.5版绘制图形。
硬件
在配备48 GB RAM和双Intel Xeon X5650六核处理器的Dell PowerEdge M610刀片服务器上进行了性能测试,处理器运行频率为2.67 GHz。X5650处理器具有同步多线程功能,也称为超线程(HT)。启用HT后,每台计算机总共有24个逻辑核。
线程
这些程序使用1到24个线程运行。为了充分利用硬件,通常最合适的方法是使用与逻辑内核数量相等的线程数量。然而,软件在HT影响和有效利用可用岩芯的能力方面存在重要差异。为了简化比较,一些测试只使用1个或24个线程执行。
数据库序列
UniProt知识库11.0版[19]性能测试中使用了由2007年5月29日的Swiss-Prot 53.0版和TrEMBL 36.0版组成。该数据库包含4 646 608个蛋白质序列,共有1517 383 530个氨基酸残基。最长序列包含36805个残基。
之所以选择此数据库,是因为它的大小足够大,可以实现实际效果,但小于某些软件的2GB文件大小限制。该数据库也不包含某些软件无法处理的任何特殊的J、O或U氨基酸残基符号。最后,在可预见的将来,此版本的数据库应该可以下载,使其也适合于未来的基准测试。
当前版本的SWIPE无法处理按formatdb拆分为单独卷的数据库。因此,SWIPE无法搜索超过约40亿氨基酸的数据库。
通过一个简单的Perl脚本将数据库转换为FASTA格式,然后使用NCBI formatdb 2.2.24版将其格式化为NCBI BLAST二进制数据库格式[4]. 此二进制格式由SWIPE、BLAST和BLAST+读取,而STRIPED和SWPS3直接读取FASTA格式的数据库文件。
查询序列
具有登录号的32个查询序列{“类型”:“entrez-protein”,“属性”:{“文本”:“P56980”,“term_id”:“9972410”,“term_text”:“P16980”}}第56980页,{“类型”:“entrez-protein”,“属性”:{“文本”:“O29181”,“term_id”:“14424149”公元29181年,{“类型”:“entrez-protein”,“属性”:{“文本”:“P03630”,“term_id”:“116702”,“term_text”:“PO3630”}}P03630号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P02232”,“term_id”:“122087146”,“term_text”:“PO2232”}}P02232号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P01111”,“term_id”:“131883”,“term_text”:“P1111”}}P01111号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P05013”,“term_id”:“124460”,“term_text”:“PO5013”}}P05013号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P14942”,“term_id”:“121714”,“term_text”:“P14942”}}第14942页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P00762”,“term_id”:“136409”,“term_text”:“PO0762”}}P00762号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P53765”,“term_id”:“952011467”,“term_text”:“P13765”}}第53765页,{“类型”:“entrez-protein”,“属性”:{“文本”:“Q8ZGB4”,“term_id”:“29611866”,“term_text”:“q8ZGB5”}}Q8ZGB4型,{“类型”:“entrez-protein”,“属性”:{“文本”:“P03989”,“term_id”:“34305677”,“term_text”:“PO3989”}}P03989(替换相同但过时的{“类型”:“entrez-protein”,“属性”:{“文本”:“P10318”,“term_id”:“122167”,“term_text”:“P10318”}}第10318页),{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}P07327号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P01008”,“term_id”:“113936”,“term_text”:“P1008”}}P01008号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P10635”,“term_id”:“84028191”,“term_text”:“P10635”}}第10635页,{“type”:“entrez protein”,“attrs”:{“text”:“P58229”,“term_id”:“15214333”,“term_text”:“P58229”}第58229页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P25705”,“term_id”:“114517”,“term_text”:“P25705”}}第25705页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P03435”,“term_id”:“122942”,“term_text”:“PO3435”}}P03435号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P42357”,“term_id”:“1170423”,“term_text”:“P2357”}}第42357页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P21177”,“term_id”:“119811”,“term_text”:“P21177”}}P21177基因,{“类型”:“entrez-protein”,“属性”:{“文本”:“Q38941”,“term_id”:“75101877”,“term_text”:“QA8941”}}问题38941,{“type”:“entrez protein”,“attrs”:{“text”:“O60341”,“term_id”:“51315808”,“term_text”:“O60341”}}O60341号机组,{“类型”:“entrez-protein”,“属性”:{“文本”:“P27895”,“term_id”:“85681922”,“term_text”:“P27895”}}第27895页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P07756”,“term_id”:“117492”,“term_text”:“PO7756”}}P07756号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P04775”,“term_id”:“116448”,“term_text”:“PO4775”}}P04775号,{“类型”:“entrez-protein”,“属性”:{“文本”:“P19096”,“term_id”:“54040727”,“term_text”:“P19096”}}第19096页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P28167”,“term_id”:“48429221”,“term_text”:“P28167”}}第28167页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P0C6B8”,“term_id”:“182676519”,“term_text”:“p066B8”}}P0C6B8号机组,{“类型”:“entrez-protein”,“属性”:{“文本”:“P20930”,“term_id”:“84028206”,“term_text”:“P20930”}}第20930页,{“类型”:“entrez-protein”,“属性”:{“文本”:“P08519”,“term_id”:“2203400178”,“term_text”:“PO8519”}}P08519号,{“type”:“entrez protein”,“attrs”:{“text”:“Q7TMA5”,“term_id”:“81894378”,“term_text”:“Q7TMA5”}}Q7TMA5问题,{“类型”:“entrez-protein”,“属性”:{“文本”:“P33450”,“term_id”:“13124727”,“term_text”:“P23450”}}第33450页和{“类型”:“entrez-protein”,“属性”:{“文本”:“Q9UKN1”,“term_id”:“187609692”,“term_text”:“QUKN1”}}问题9UKN1,长度从24到5478个残基从UniProt数据库中检索到[18]. 其中大多数以前曾多次用于性能测试。为了简化比较,一些测试仅使用375个长残基进行{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}第07327页查询,表示大致平均长度的蛋白质。
得分矩阵和差距惩罚
对BLAST接受的所有82种不同氨基酸替代评分矩阵组合和差距惩罚进行了测试。使用的矩阵为BLOSUM系列中的BLOSUM45、BLOSUM50、BLOSUM62、BLOSOM80和BLOSUM90[20]以及PAM系列中的PAM30、PAM70和PAM250[21]. 矩阵来自NCBI FTP站点。为了与SWPS3程序兼容,从矩阵中删除了停止密码子(*)的行和列。SWPS3只能使用BLOSUM45、50和62矩阵成功运行。为了简化比较,一些测试仅使用BLOSUM62矩阵进行,间隙开放和扩展惩罚分别为11和1,这是BLAST的默认值。
结果
算法
可以使用动态规划方法计算两个序列的最佳局部对齐分数。Smith和Waterman算法的递推关系[1]经过Gotoh的修改[2]对于仿射间隙惩罚函数如下所示。
查询顺序q个长度的米含有残留物q个我.数据库序列d日长度的n个含有残留物d日j个.小时i、 j个是对齐的前缀的分数q个和d日以残留物排列结束q个我和d日j个.E类i、 j个和F类i、 j个是对齐相同前缀的分数q个和d日但在查询和数据库序列中分别出现了一个缺口。P(P)[q个我,d日j个]是对齐残留物的分数q个我和d日j个根据替代得分矩阵P(P).问是缺口开放和延期罚款的总和,而对是缺口扩展缺口惩罚。S公司是整体最优局部对齐分数。
计算是逐列进行的。仅部分小时,E类和F类矩阵需要保存在内存中:F类矩阵以及两个包含米元素,对应于小时和E类矩阵。
实施
实现的主要功能如下所述。
16个数据库序列的并行化
16个不同数据库序列的残留物并行处理,如图所示将这16个残基全部同时与相同的查询残基进行比较。这些操作是使用由16个独立字节组成的向量执行的。16个残基被送入16个独立的通道。当这十六个数据库序列中的第一个结束时,下一个数据库序列的第一个剩余部分将加载到通道中。按照在原始数据库文件中找到的顺序读取数据库序列。与Rudnicki的方法相反等. [14],数据库不按序列长度排序。图说明了这种方法。
一起处理的数据库残留物块。处理的前五个矢量的残留物显示在灰色、蓝色、红色、绿色和黄色背景上。每个数据库序列中的四个符号构成一个组处理的块。一些序列块的填充用粉色背景上的破折号表示。另一个数据库序列更改用粉红色竖线表示。序列下方的箭头表示新序列开始的位置。
十条指令的紧凑核心代码
对齐矩阵中每个单元格中的值的计算基础是算法部分中描述的递归关系。计算可以用十条汇编指令编写,这十条指令构成了计算内部循环的核心,如图所示。这十条指令并行计算独立对齐矩阵中16个单元格的每个矢量的值。正确选择指令及其顺序很重要;因此,这部分代码是在汇编程序中手工编码的,以最大限度地提高性能。在图中,小时表示主得分向量。这个小时向量保存在N个对角线上下一个单元格的向量。E类和F类分别表示以查询和数据库序列中的间隙结束的比对的得分向量。P(P)是数据库序列的替换分数与查询残差的向量q个(见下面的临时分数档案)。问表示间隙开放加上间隙扩展惩罚的向量。对表示间隙扩展惩罚向量。S公司表示当前最佳得分向量。所有矢量,除了N个在此代码之前进行初始化。
核心说明。这是对对齐矩阵中每个单元格向量执行的十条核心指令。在此代码中,第一个(左)操作数是源,第二个(右)操作数是目标。
沿着数据库序列处理四个连续的单元格
在矩阵单元的计算过程中,两个数组中的值小时和E类每个矩阵单元的值通常必须读写一次。这些数组通常足够小,可以在接近的缓存级别进行缓存,因此内存访问时间不应成为主要问题,但仍需要为每个单元格写回和读回它们。由于有16个128位xxm寄存器可用,并且有足够的空间用于保存小时,E类和F类寄存器中几个单元格的值,可以通过计算数据库序列中的几个连续单元格来减少运行时间,然后再进行下一个查询剩余。发现四个连续的细胞表现良好。沿着查询序列展开一次内部循环也能很好地工作。然后,基本计算块由两乘以四个单元组成,这些单元在每个内部循环迭代中进行处理,如图所示.
每次迭代中计算的单元块。在计算出的对齐矩阵中八个单元的内部循环块的每次迭代中。这个小时,E类,F类和S公司每个单元格的值都会更新。计算从左上角的单元格开始,向右进行三次,然后从第二行的左侧继续。
更新分数和填充块
当一个新的数据库序列在其中一个通道中开始时,必须记录上一个数据库序列的分数。此外小时,E类和S公司必须重置上一序列的分数。当要处理新列时,将检查是否有任何数据库序列在前一列中结束。如果是这样,则进行特殊处理。记录结束的序列的分数。创建一个掩码,稍后用于重置小时,E类和S公司在处理新列之前在适当的通道中。通道被填满,并启动一个或多个新序列。如果前一列中没有结束的序列,则会对新列执行更简单、更快的处理步骤。在更简单的处理步骤中,无需保存分数,无需启动新序列,也无需创建或使用掩码。由于大多数列的类型都比较简单,因此总体性能主要取决于处理简单列的速度。为了简化计算,如果每个信道的长度不是4的倍数,则在序列结束后用1-3个空符号填充每个信道,以确保新的数据库序列将仅在新的单元块的开始处开始。此填充在图中以粉红色表示。填充会稍微增加电池的总数,但只允许对每四个残留物执行上述检查。
临时分数曲线的计算
为了使计算速度更快,很重要的一点是可以快速加载替换得分值的向量。每个得分向量对应于单个查询残差相对于不同数据库序列中16个残差的得分。如图所示,创建了一种临时分数配置文件。此分数配置文件适用于将任何查询残差与16个数据库序列中的4个连续残差进行匹配。对于数据库序列中的每四个残基,必须构建一个新的分数剖面。
为64个数据库序列残留物创建临时评分模板标准得分矩阵和16个不同数据库序列的4个残差构成了一种临时部分数据库序列得分剖面的基础。分数配置文件支持将任何查询残留物与这64个数据库残留物进行快速比较。
临时分数配置文件是使用一系列压缩混洗指令(pshufb)从普通替换分数矩阵(例如BLOSUM62)和4×16数据库序列残差创建的。洗牌指令仅在含补充数据流单指令多数据扩展指令集3(SSSE3)的英特尔处理器上可用。在没有SSSE3的处理器上(即AMD处理器和较旧的Intel处理器),可以使用一系列解包指令(punpcklbw、punpckhbw),通过一种矩阵转置操作来代替计算,但速度损失不大。
分数范围和算术指令的选择
最初只使用7位的分数范围进行计算。这允许使用SSE2指令并行计算16个校准分数矩阵。加减运算是使用有符号和饱和算术进行的,而最大运算是对无符号数进行的。只使用-128到-1(有符号数字)或128到255(无符号数字)之间的7位分数范围。所有分数的偏差为128。这个值范围将确保有符号饱和加减法在下边界上很好地工作。此外,无符号最大值在这个范围内也能很好地工作。该范围支持使用压缩的最大无符号字节指令(pmaxub)和压缩的有符号饱和字节加减指令(paddsb和psubsb),这些指令在所有SSE2处理器上都可用,并且速度最高。
由于速度较慢,因此不使用8位范围,该范围允许与7位范围相同数量(16)的并行计算,同时允许更宽的分数范围。可以使用-128到127的范围,也可以使用0到255的范围。并行计算最大字节数(pmaxub,pmaxsb)和并行加减字节数(paddusb,psubusb,paddsb,psubsb)的指令都有有符号和无符号版本,但用于最大有符号字节数的pmaxsb-指令最近才在SSE4.1中可用,速度比pmaxub-慢。可以使用无符号加减法(paddusb和psubusb),但分数矩阵向量的加法需要两条指令。首先,必须添加包含偏差的得分向量;然后必须减去偏差。
还实现了使用16位和63位分数范围的版本,并在分数范围较低的计算中检测到溢出时使用。16位版本允许8个并行计算。当在分数范围较窄的计算中检测到潜在溢出时,将使用下一个较宽的分数范围(首先是16位,必要时再是63位)重新计算该数据库序列的对齐分数。由于相当少的序列通常会达到无法用7位表示的分数,因此较宽分数范围的额外计算时间通常可以忽略不计。
在使用较窄的分数范围处理数据库序列块(见下文)中的所有序列后,对序列子集执行分数范围更宽的重新计算。
正在读取序列数据库
数据库序列以由formatdb工具生成的NCBI BLAST数据库格式存储。这是一种二进制格式,其中序列信息至少分为3个文件:索引(.pin)、标头(.phr)和序列(.psq)。文件格式允许高效地将序列读入内存。蛋白质序列使用1-24和26-27范围内的字节值存储,字节值分别表示氨基酸残基A-I、K-N、P-T、V-Z、U、O和J。序列由零字节分隔,这简化了序列结束的检查。
使用.pin和.psq文件的内存映射检索数据库序列。这是访问序列的一种有效且方便的方法,在这种方法中,操作系统管理在必要时从磁盘将数据读入内存,同时执行程序。序列数据库被划分为每个线程100个块。每个块包含大致相同数量的序列。在映射下一个块之前,将一个块中的序列映射到内存中并进行处理。这会导致程序占用较小的内存。
多个线程
SWIPE使用多个线程(pthreads)在序列数据库的不同部分上工作。线程数是在启动程序时指定的,通常应等于计算机的内核数。对于具有超线程的最新几代英特尔处理器,线程数等于逻辑内核数通常是最有效的。当线程准备进行更多工作时,会将数据库序列块分配给线程,因此线程可能不会处理完全相同数量的块。线程的结果在处理每个块后插入到一个常见的命中列表中。
测试
SWIPE软件在许多不同条件下根据BLAST、BLAST+、STRIPED和SWPS3进行了基准测试,以测量速度。研究了使用可变线程数的性能以及查询序列长度的影响。此外,还研究了不同评分系统、替代评分矩阵以及差距开放和延期处罚的影响。
线程
图指示以1到24个线程运行的程序的性能,375个剩余长度{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}P07327号查询序列、BLOSUM62矩阵和,缺口打开和扩展惩罚分别为11和1。SWIPE使用单个线程以9.1 GCUPS的速度运行,并以106.2 GCUPS的19个线程达到其最大性能,但超过12个线程的额外线程几乎没有任何收益。它的伸缩性很好,最大加速比(最大速度与单线程速度之比)为11.6。SWPS3使用单线程在3.4个GCUPS下运行,并在12个线程和16.4个GCUPS下达到最佳性能,但在9个线程之外几乎没有增益。最大加速比为4.8。令人惊讶的是,使用两个线程的速度低于使用单个线程的速度。用GNU编译器编译的STRIPED以3.1GCUPS的单线程运行,并以14.7GCUPS的23个线程达到其最大性能,但超过12个线程后几乎没有什么收益。最大加速比为4.8。使用英特尔编译器编译STRIPED后,在单线程上运行时,速度提高了21%,达到3.7 GCUPS,但在23个线程上运行的GCUPS速度仅提高了2%,达到15.0 GCUPS。这对应于4.0的最大加速。BLAST和BLAST+分别以14.7和15.5 GCUPS的速度运行,当24个线程分别以208.4和178.9 GCUPS的速率运行时,单个线程的伸缩性非常好,并达到其最大性能。BLAST和BLAST+的最大加速比分别为14.2和11.5。
查询长度
图和图说明了使用24个线程(B)或单个线程(C)执行不同长度的查询时的性能。32个不同的序列被用作查询,长度从24到5478个氨基酸残基。
SWIPE的性能曲线相当平坦。对于少于大约100个剩余数的查询,性能会逐渐下降,尤其是在运行多个线程时。当使用多个线程时,对于非常长的查询,速度也略有降低。24个线程的性能从23.1到110.1 GCUPS不等,单线程的性能则从3.9到9.8 GCUPS不等。
SWPS3程序非常依赖于查询长度,24个线程的速度范围为0.94到49.0 GCUPS,单个线程的速度为1.1到4.6 GCUPS。
用英特尔编译器编译的STRIPED程序也非常依赖于查询长度,尤其是在24个线程上运行时,速度从1.2到46.6 GCUPS不等。在单个线程上,STRIPED的速度在0.8到5.7 GCUPS之间变化。用GNU编译器编译的STRIPED通常稍慢,尤其是对于较长的查询。
BLAST程序的速度似乎更快,查询序列更长,BLAST和BLAST+的速度分别为52.8到374.1和30.6到360.2 GCUPS,但性能因序列而异。当查询长度小于大约100个残数时,性能明显下降。
评分系统
图显示了不同评分系统下的表现。对BLAST允许的矩阵和间隙惩罚的所有组合进行了测试。375号残渣长{“类型”:“entrez-protein”,“属性”:{“文本”:“P07327”,“term_id”:“113390”,“term_text”:“PO7327”}}P07327号使用了查询序列和24个线程。SWIPE的性能几乎恒定在102-106 GCUPS左右。STRIPED和SWPS3的性能也几乎恒定在14-15和15 GCUPS左右。BLAST的性能高度依赖于所使用的评分矩阵。使用BLOSUM50矩阵,SWIPE的速度几乎是普通BLAST的两倍。这两个程序的速度与PAM250矩阵非常相似,而其他矩阵的BLAST速度更快。总的来说,BLAST+比普通BLAST慢10-20%。一般来说,空位罚分对性能影响不大,但在少数情况下,相对较低的空位罚分似乎会降低BLAST、BLAST+和STRIPED的速度(例如,空位罚分为9和1的BLOSUM62),而对SWIPE和SWPS3的影响可以忽略不计。
讨论
与早期的SIMD实现相比,SWIPE软件大大提高了基于Smith-Waterman算法的序列数据库搜索速度,在实际情况下速度快了六倍多。发现SWIPE在双Intel Xeon X5650六核处理器系统上以106 GCUPS的速度执行375个剩余查询序列。速度有点取决于查询长度,但与使用的评分系统无关。最大速度对应于每个时钟周期中每个物理内核处理3.3个以上的单元。
使用GPU,Nvidia GeForce GTX 480图形卡上的CUDASW++2.0报告的速度高达42.6 GCUPS[18]. 这与SWIPE在四核CPU上的预期性能相当。
SWIPE几乎与最多使用12个线程的线程数成线性关系,对应于可用的物理内核数。X5650处理器具有超线程功能,这使得每个物理内核使用多个线程可以获得额外的性能,除非所有执行单元都很忙。几乎没有观察到超过12个线程的性能提高,所以当SWIPE在12个线程上运行时,执行单元显然非常繁忙。SWIPE的伸缩性比SWPS3和多线程STRIPED好得多。SWIPE的最大速度是SWPS3的6.5倍,使用375个残差查询时速度最快。当所有程序都在单个线程上运行时,SWIPE的速度大约快2.5倍。速度差异似乎有两个同样重要的因素。基于单线程性能数据,使用序列间并行方法而不是条带化方法似乎是速度提高的一半左右。高效的线程并行化似乎是另一半的原因。
在与STRIPED软件的比较中,应该注意到Farrar(2007)显然报告了“扫描时间”,而不是程序的完整运行时间,不包括将数据库序列读入内存所需的时间。此处报告了完整的运行时间。对于其他程序,很难将扫描时间与使用的其余时间分开。STRIPED直接读取FASTA格式的文件,而不是NCBI的formatdb工具格式化的文件。似乎STRIPED最初会解析整个FASTA文件,并使用非线程代码将数据库读入内存,这导致在使用多个线程并测量完整的运行时间时性能低下。排除数据库读取时间会缩短运行时间并提高性能。另一方面,读取二进制NCBI格式的文件可能比解析FASTA文本格式更快。
SWIPE的性能不太依赖于查询长度,除了非常短和非常长的查询。每个数据库残留物产生的管理费用可能会降低SWIPE在最短查询中的性能。对于最长的查询,当许多线程运行时,性能会下降。这可能是由于内存缓存的影响,其中一些缓存在内核之间共享。基于Farrar方法的程序对查询长度的依赖性要大得多,并且随着查询长度的增加执行得更好。这可能是因为随着条纹宽度的增加,条纹之间依赖性的相对重要性降低了。
使用BLOSUM50矩阵时,SWIPE的速度大约是BLAST的两倍,而使用BLOSUM62矩阵时,BLAST是SWIPE速度的两倍。发现BLAST性能非常依赖于得分矩阵。原因可能是BLASD在其启发式中使用初始命中得分阈值(T型)具有独立于指定的得分矩阵的固定默认值(11)。预期值相对较高的得分矩阵,例如BLOSUM50,将触发比其他矩阵更多的初始点击,例如PAM30。
如果要使用查询配置文件(特定位置的评分矩阵)而不是查询序列进行搜索,则需要对查询的每个位置进行临时评分配置文件的计算,而不仅仅是20个可能的氨基酸残基。这尚未实施,但由此导致的速度下降估计为30%。
此处描述的软件应被视为表明该方法性能潜力的原型。计划了一个更新的版本,该版本至少计算实际比对(不仅仅是比对分数)和匹配的统计显著性。
结论
现在,在标准硬件上使用SIMD实现高效的并行化,使得Smith-Waterman数据库搜索的运行速度大大提高。在新工具SWIPE中,将16个不同数据库序列的残差与一个查询残差进行并行比较。使用375个剩余查询序列,在双Intel Xeon X5650六核处理器系统上实现了每秒1060亿个单元更新(GCUPS)的速度,这是基于Farrar方法的软件的六倍多的速度,该方法是以前最快的实现。此外,基于Smith-Waterman的搜索速度首次被证明明显超过了BLAST的搜索速度,至少在一个特定的评分矩阵中是如此。
由于速度较慢一直是限制基于Smith-Waterman的搜索实用性的主要缺点,因此此处描述的方法可以显著拓宽此类搜索的潜在应用。其他需要最佳局部对齐分数的应用程序,如短读映射[22]或基因组序列组装[23]也可以从该方法的改进性能中受益。这里使用的方法可能也适用于基于HMM的搜索。
补充材料
附加文件1:源代码SWIPE 1.0版的源代码,以及64位Linux的二进制可执行文件和分数矩阵都包含在这个压缩的tar存档文件中。
致谢
这项工作得到了挪威研究委员会的支持,并获得了CMBN的CoE拨款。这要感谢奥斯陆大学信息技术中心的研究计算服务小组访问Titan集群和其他服务。
工具书类
- Smith TF,Waterman MS。常见分子子序列的鉴定。分子生物学杂志。1981;147:195–197. doi:10.1016/0022-2836(81)90087-5。[公共医学] [交叉参考][谷歌学者]
- Gotoh O.一种改进的生物序列匹配算法。分子生物学杂志。1982;162:705–708. doi:10.1016/0022-2836(82)90398-9。[公共医学] [交叉参考][谷歌学者]
- Altschul SF、Gish W、Miller W、Myers EW、Lipman DJ。基本本地对齐搜索工具。分子生物学杂志。1990;215:403–410。[公共医学][谷歌学者]
- Altschul SF、Madden TL、Schaffer AA、Zhang J、ZhangZ、Miller W、Lipman DJ。Gapped BLAST和PSI-BLAST:新一代蛋白质数据库搜索程序。核酸研究。1997;25:3389–3402. doi:10.1093/nar/25.17.3389。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Li ITS、Shum W、Truong K.使用现场可编程门阵列(FPGA)将Smith-Waterman算法加速160倍BMC生物信息学。2007;8:185.网址:10.1186/1471-2105-8-185。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Alpern B、Carter L、Gatlin KS。微平行性和高性能蛋白质匹配。1995年ACM/IEEE超级计算会议记录,加利福尼亚州圣地亚哥,1995年12月3-8日。
- 英特尔公司。英特尔64与IA-32体系结构优化参考手册。2011
- 沃兹尼亚克A.使用视频指令加快序列比较。计算应用生物科学。1997;13:145–150.[公共医学][谷歌学者]
- Rognes T,Seeberg E.在普通微处理器上使用并行处理将Smith-Waterman序列数据库搜索速度提高了六倍。生物信息学。2000;16:699–706. doi:10.1093/bioinformatics/16.8699。[公共医学] [交叉参考][谷歌学者]
- Farrar M.Striped Smith-Waterman将数据库搜索速度提高了六倍于其他SIMD实现。生物信息学。2007;23:156–161. doi:10.1093/bioinformatics/btl582。[公共医学] [交叉参考][谷歌学者]
- Farrar MS为蜂窝宽带引擎优化Smith Waterman。http://sites.google.com/site/farrarmichael/SW-CellBE.pdf
- Szalkowski A、Ledergerber C、Krähenbühl P、Dessimoz C.SWPS3-用于IBM Cell/B.E.和x86/SSE2的快速多线程矢量化Smith-Waterman。BMC Res注释。2008;1:107.网址:10.1186/1756-0500-1-107。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Wirawan A、Kwoh CK、Hieu NT、Schmidt B.CBESW:Playstation 3上的序列对齐。BMC生物信息学。2008;9:377.网址:10.1186/1471-2105-9-377。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Rudnicki W、Jankowski A、Modzelewski A、Piotrowski A和Zadrożny A.Smith-Waterman算法在细胞微处理器上的新SIMD实现。基金通知。2009;96:181–194. [谷歌学者]
- Liu Y,Maskell DL,Schmidt B.CUDASW++:为支持CUDA的图形处理单元优化Smith-Waterman序列数据库搜索。BMC Res注释。2009;2:73.网址:10.1186/1756-0500-2-73。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- LigowskiŁ,Rudnicki WR。使用CUDA在GPU上高效实现Smith-Waterman算法,用于大规模并行扫描序列数据库。第八届IEEE高性能计算生物学国际研讨会,意大利罗马,2009年5月25日。
- Liu Y、Schmidt B、Maskell DL。CUDASW++2.0:基于SIMT和虚拟SIMD抽象,在启用CUDA的GPU上增强Smith-Waterman蛋白质数据库搜索。BMC Res注释。2010;3:93.doi:10.1186/1756-05000-3-93。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- LigowskiŁ、Rudnicki WR、Liu Y、Schmidt B。GPU计算宝石,翡翠版。摩根考夫曼;2011.使用Smith-Waterman算法精确扫描序列数据库;第155-157页。[谷歌学者]
- UniProt财团。2010年的Universal Protein Resource(UniProt)。核酸研究。2010;38:D142–8。 [PMC免费文章][公共医学][谷歌学者]
- Henikoff S,Henikof J.蛋白质块的氨基酸替代矩阵。美国国家科学院院刊。1992;89:10915–10919. doi:10.1073/pnas.89.22.10915。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Dayhoff MO、Schwartz RM、Orcutt BC。在:蛋白质序列和结构图谱。补充3。Dayhoff MO,编辑。第5卷。Natl Biomed Res Found,华盛顿特区;1978年,蛋白质进化变化模型;第345-352页。[谷歌学者]
- Rumble SM、Lacroute P、Dalca AV、Fiume M、Sidow A、Brudno M.SHRiMP:短颜色空间读数的精确映射。公共科学图书馆计算生物学。2009;5:e1000386.doi:10.1371/journal.pcbi.1000386。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]
- Miller JR、Koren S、Sutton G.下一代测序数据的汇编算法。基因组学。2010;95:315–27. doi:10.1016/j.ygeno.2010.03.001。 [PMC免费文章][公共医学] [交叉参考][谷歌学者]