当前位置:文档之家› CUDA平台下的复杂疾病全基因组基因-基因相互作用研究

CUDA平台下的复杂疾病全基因组基因-基因相互作用研究

CUDA平台下的复杂疾病全基因组基因-基因相互作用研究
CUDA平台下的复杂疾病全基因组基因-基因相互作用研究

上海交通大学

硕士学位论文

CUDA平台下的复杂疾病全基因组基因-基因相互作用研究

姓名:胡晓菡

申请学位级别:硕士

专业:生物医学工程

指导教师:师勇

20100501

CUDA平台下的复杂疾病全基因组基因-基因相互作用研究 

 

摘要 

复杂疾病的全基因组基因-基因扫描可以有效发现多个基因的相互作用对疾病易感性的贡献。但是这种扫描的计算量通常非常巨大,限制了它的实际应用。现代图形处理器(GPU,显卡)已具有非常强大的并行计算能力,同时价格低廉。因此,在这项研究中我们使用了基于GPU的算法,即SHEsisEpi。它仅与多个位点在全基因组中的易感性相关,而不受单个位点的关联分析结果(即边际函数)影响。

我们分析了WTCCC数据库提供的双向情感障碍(bipolar disorder, BPD)数据,仅耗时27小时就完成了全基因组一共500K个SNP的扫描,比传统的CPU程序快将近300倍。

然后,我们通过对扫描结果进行筛选(p=5.37×10-12),对p值最小并且符合条件的SNP组合,用独立的样本进行重复实验(475个BPD病例,480个对照组,汉族人群),证明两对基因组合与BPD的易感性相关(a=0.05)。可执行文件和源代码可从SHEsis主页进行下载(https://www.doczj.com/doc/c82624281.html,)。 

关键词:基因-基因相互作用,双向情感障碍,GPU编程,CUDA 

Genome-wide gene-gene interaction analysis for complex diseases using

CUDA platform

ABSTRACT

Genome-wide gene-gene interaction scan is a promising method to study susceptibility epistasis effects of complex diseases, but its huge computational burden is the biggest challenge for practice. Graphic Processing Unit (GPU) is highlighted to have extremely high parallel computing ability and low cost. In this study, we developed a GPU-based analytical method, named as SHEsisEpi, which purely focuses on risk epistasis in genome-wide association study (GWAS) of complex traits, excluding the contamination of marginal effects caused by single locus association. In the practice of analyzing WTCCC’s GWAS data of bipolar disorder with 500K SNPs, our algorithm only used 27 hours to finish the exhaustive scan and was more than 300 times faster than CPU-based analysis on our system. We demonstrated that SHEsisEpi was very efficient, low cost and applicable.

Furthermore, by genotyping the top finding meeting out criterias (p=5.37×10-12) and its nearby SNP pairs in another independent 475 bipolar disorder patients and 480 normal controls from Chinese Han population, we validated these findings, related with 2 gene pairs, conferring risk (a=0.05) to bipolar disorder. Binary files and source codes of our program can be downloaded athttps://www.doczj.com/doc/c82624281.html, from the main menu of SHEsis.

Keywords: Gene-gene interaction, bipolar disease, GPU programming, CUDA

第一章全基因组基因-基因相互作用分析

1.1 全基因组关联分析

复杂疾病又称常见疾病或多基因病,是由多对微效基因与环境因素共同作用所致,具有明显的遗传异质性、表型复杂性及种族差异性等特征。复杂疾病人群中的发病率高,严重影响人类的身心健康,如糖尿病、癌症、中风、心脏病、抑郁症、哮喘、自身免疫病等。遗传因素在复杂疾病的发病中起到重要作用。在关联分析研究方法提出以前,人们主要利用连锁分析方法开展复杂疾病遗传易感性研究。连锁分析是发现单基因疾病的致病基因非常有效的方法,目前已发现了超过2,000多种单基因疾病的致病基因[1],为这些疾病的基因诊断和基因治疗奠定了基础。尽管连锁分析方法被广泛应用,在一些复杂疾病研究中也取得一些成绩,发现一些疾病易感基因,但是总体上来说,连锁分析研究复杂疾病的效率不高[2]。即使通过连锁分析确定的候选区域内选取遗传变异单核苷酸多态性(SNPs)进行关联分析,发现的信息量也有限,并且难以综合评价分析。其原因在于复杂疾病具有明显的遗传异质性、表型复杂性等特点,使得在以家系为基础的全基因组连锁分析发现的易感基因位点或易感基因难以重复,难以推广到复杂疾病中的大部分散发病例,因而使得连锁分析在研究复杂疾病相关遗传学研究面临困境[3, 4]。

1996年,Risch et al[5]提出对于常见复杂疾病的遗传学研究中,关联分析较连锁分析有更高的效率。随着人类基因组计划( human genome project,HGP)的实施,大大推动关联研究的发展。关联分析对于发现复杂疾病的微效基因具有更高的效力,更适宜于研究复杂疾病背后的致病基因或位点。其基本原理是:在一定人群中选择病例组和对照组,某个等位基因或基因型在病例出现的频率明显高于或低于对照,说明它与疾病有关联性。通过观察标记位点与致病基因位点间存在连锁不平衡现象,得到某一遗传标记和引起疾病基因关联的相对危险度。比如在糖尿病患者中等位基因C的频率是0135,而在对照中的频率是0123,经过统计分析发现差异有显著性,可以说等位基因C与疾病存在关联性。

2003年HGP的完成为阐明人类基因组序列,解读生命遗传密码,推动生命科学发展奠定了坚实基础。2005年国际人类基因组单体型图(humanhaplotype map,HapMap)计划的完成,为研究者建立某一特定疾病(表型)风险与遗传多态位点之间的联系提供了可能,进而为预防、诊断和治疗疾病提供了新的方法[6]。HapMap计划主要是研究来

自非洲、亚洲和欧洲人群的样本(主要包括尼日利亚、中国、日本、美国),记录描述人类基因组中常见遗传多态位点变异的形式、存在的位置、在同一群体内部和不同人群间的分布状况。目前该计划已发现了人类基因组中310多万个常见SNPs。随着HGP和HapMap计划完成,特别是HapMap计划取得的成果为研究者提供能将遗传多态位点(高密度的遗传变异图)和特定疾病(性状)风险联系的相关信息,使得全基因组关联分析研究(genome-wide association study,GWAS)成为可能,从而从根本上改变了基因研究的“蓝图”。

GWAS是从人类全基因组范围内的序列变异(单核苷酸多态,Single Nucleotide Polymorphism,SNP)中,筛选出那些与疾病性状关联的SNP[7]。它被定义为一种确定遗传与表型(如血压、体重等)或与某种疾病(或生理状态)的全基因组范围的关联性分析研究。全基因组相关遗传信息结合临床以及其它表型数据为更好的理解基本生物学过程对人类健康的影响提供了可能。同时,推动了疾病发生的预报和疾病治疗手段的进步,并将在根本上实现真正的个性化医疗。另外,不同类型人类基因多态性的认识加深以及成熟的高通量、低成本基因分型技术以及设备的飞速发展,为研究基因多态性与健康和疾病的相关性作出了巨大贡献[8]。GWAS的统计分析,依据研究设计的不同可以采用不同的分析方法,如图1.1所示[7]。

目前科学家基于GWAS的研究方法,利用高通量基因芯片技术可同时对每一个个体检测数十万到一百万个SNP,进而在全基因组水平开展大样本量的关联分析,然后将相关阳性位点在独立的样本中加以验证,进而为后续的功能研究奠定基础。随着分型技术的快速发展和分型成本的不断降低,商业化的覆盖整个人类基因组的高通量SNP检测芯片日益完善[9-11]。从最初含10万SNPs基因分型芯片Affymatric 10K到目前通量不断增加的Affymatric 500K、610以及Illumina 300K、6102quad、1M等高密度SNPs 芯片及同时整合了拷贝数变异(copy number variants,CNVs),如Illumina370、6102quad、以及Affymatric 610等。研究者可以同时对人类基因组常见变异SNPs和CNVs进行分型研究。与此同时,优秀而且具有更加强大效能的统计学方法和软件的出现,使得GWAS 得到迅速发展,让科学家能够同时研究更多的样本,发现更多的与疾病相关的微效遗传变异[12]。

图1.1 GWAS的统计分析方法 

2005年,《科学》杂志报道了Klein et al[13]利用Affymetrix100K基因芯片对年龄相关性视网膜黄斑变性(age-related macular degeneration)进行GWAS研究的结果,该项研究是第一个关于复杂疾病易感基因的GWAS。此后一系列有关复杂疾病易感基因的GWAS报道不断出现,特别是2006年后一系列复杂疾病易感基因的GWAS结果相继发

表在《科学》、《自然》、《自然遗传》和《新英格兰医学杂志》等世界顶级学术杂志上。据美国NIH全基因组关联分析权威数据库收录(https://www.doczj.com/doc/c82624281.html,/26525384)统计显示,目前已有肿瘤(胃癌、乳腺癌、结肠癌、直肠癌、前列腺癌、肺癌、黑色素瘤、神经母细胞瘤等)、自身免疫病(糖尿病、系统性红斑狼疮、类风湿性关节炎等)、心血管疾病(冠心病、高血压、心肌梗死等)、神经退行性疾病(阿尔茨海默症、帕金森病、肌萎缩性侧索硬化、多发性硬化症等)、精神疾病(精神分裂症、双向情感障碍等)、胃肠道疾病(克罗恩病、乳糜泻、胆石症等)等及肥胖、身高、肤色、骨密度、血脂等100多种与人类生命密切相关的重要复杂疾病和(或)性状的易感基因被陆续揭示。

1.2 基因-基因相互作用分析

GWAS解析的只是单个SNP位点对疾病易感性的贡献[14],而在大部分情况下,复杂疾病的致病位点不止一个。大量证据及经验说明,复杂疾病的性状受到多个位点之间相互作用的共同影响[15-18]。基因互作可分为以下几种[19]

l 共上位效应:控制同一性状的两对非等位基因各自的显性基因表型效应不同,双显时两者同时显现从而形成新的表现型。区别于一对等位基因的共显性,这

种两对基因的互作关系叫做共上位。

l 累加效应:控制同一性状的两对非等位基因的显性表型效应相同,双显同时存在时呈现比各自单独存在时更突出的新表现型,是两者的效应可以累加。

l 重叠效应:控制同一性状的两对非等位基因的显性表型效应相同,双显同时存在时呈现与各自单独存在时相同的表现型,即是两者的效应相互重叠。

l 互补效应:控制同一性状的两对非等位基因需同时存在显性基因时,能表现一种表现型,否则为另一表现型,即是彼此起互补作用。

l 隐性上位作用:两对基因控制同一性状,其中一对基因对另一对基因的表现有遮盖作用,叫做上位性。隐性上位指的是当上位基因是隐性时才起遮盖作用。

l 显性上位作用:两对基因控制同一性状,其中一对基因的显性效应对另一对基因的表现有遮盖作用,叫显性上位。

l 抑制效应:某对基因本身没有表型效应,但是当它的显性基因存在时另一对基因的效应就不能显现,即是前者对后者起抑制作用。

理论证明,许多上位互作的疾病模型可以完全不受主效应影响[20]。这时,就可以使用全基因组水平的基因-基因相互作用分析,对隐藏的多位点易感性进行识别。特别是,这种分析不受单个位点关联分析的影响。

多年前,Frankel和Schork就解释了上位互作是复杂疾病的致病机理的原因,但是却并未引起广泛重视[21]。Wright 70年前就提出,基因之间会频繁地产生相互作用,打破原有的孟德尔遗传率,并导致新的表现型出现[22],后来这被称为上位互作[23]。从生物学或者遗传学角度讲,这种对孟德尔分离比的违背,是由于一对基因对另一对基因产生了屏蔽效应;而从统计学角度讲,上位互作违背了线性系统的可加性[24,25]。尽管如此,一个人群中生物学和遗传学范畴的上位互作差异,导致了它在统计上的值变大,而病例组和对照组中存在的遗传学范畴的上位互作差异,则影响到疾病的易感性[26]。

实际应用中,我们希望得到一种高效的,既可以不受单位点关联分析结果影响(边际效应)地检测出上位互作,又对能够完整地对整个基因组进行扫描的算法。目前比较常用的基因互作算法,如逻辑回归和MDR(multifactor dimensionality reduction)[27],前者的计算复杂度非常高,根本不可能运用于全基因组分析;后者虽然大幅提升了速度,却在精简计算集的过程中丢弃了许多候选位点组合。以本文使用的Affmetrix 500K芯片数据为例,全基因组数据一共包括500,000个不同SNP数据,对其进行随机的两两组合,一共有500,000×500,000/2=1.25×1011(125G)种不同组合,只有使用超级计算机或集群计算/云计算方可在短时间内得到结果,如果需要分析多个疾病,耗时就更加漫长。对于普通研究者,这是一道相当高的限制门槛。

1.3 本章小结

本章介绍了复杂疾病的概念,对其发病原因的研究,从最早的连锁分析,关联分析,HapMap计划,再到GWAS,这些都取得了不俗的成果。但是复杂疾病通常由多个位点共同作用,而以上方法主要是针对单个位点。因此,基因-基因相互作用分析成为当前的热门研究方向。基因互作包括共上位效应、累加效应、互补效应、隐性上位作用、显性上位作用、抑制效应六种方式。理论证明,上位互作的疾病模型可以完全不受单个位点关联分析的影响,对隐藏的多位点易感性进行识别。但是实际应用中,如果想对全基因组的芯片数据进行两两扫描,计算量非常巨大,成为其发展的瓶颈之一。

第二章 GPU编程简介

2.1 CPU多核并行

过去20年间,Intel、AMD等厂家推出的CPU性能在不断提高,但发展速度与20世纪80年代末90年代初的飞跃相比,已经不能相提并论。按照摩尔定律,每18~24个月芯片上可集成的晶体管数量就会翻倍,这一速度带来了处理能力和速度的飞速增长[28]。 

CPU提高单个核心性能的主要手段是提高处理器的工作频率,以及增加指令级并行。这两种传统的手段都遇到了问题:随着制造工艺的不断提高,晶体管的尺寸越来越接近原子的数量级,漏电流问题愈加显著,单位尺寸上的能耗和发热也越来越大,使得处理器的频率提高速度越来越慢。另一方面,通用计算中的指令级并行并不多,因此费尽苦心设计获得的性能提高与投入的大量晶体管相比,显得很不划算。使用流水线可以提高指令级并行,但更多更深的流水线可能会导致效率问题,例如,Intel的Pentium 4架构中有更长的流水线,但运算性能还不及同频的Pentium Ⅲ。为了实现更高的指令级并行,就必须用复杂的猜测执行机制和大块的缓存保证指令和数据的命中率。现代CPU的分支预测正确率已经达到了99%以上,没有什么提高余地。缓存的大小对CPU的性能有很大影响,过去低端的赛扬和主流的奔腾处理器用于计算的单元基本一样,主要区别就在于缓存的大小。但是继续增加缓存大小,最多也就是让真正用于计算的少量执行单元满负荷运行,这显然无助于CPU性能的进一步提高。 

由于上述原因限制了单核CPU性能的进一步提高,CPU厂商开始在单块芯片内集成更多的处理器核心,使CPU向多核方向发展。2005年,Intel和AMD正式向主流消费市场推出了双核CPU产品,2007年推出4核CPU,2009年Intel CPU进入8核时代,Intel CPU核心数量及制程的变化如图5.1所示。随着多核CPU的普及,现代的普通PC都拥有数个CPU核心,实际上已经相当于一个小型集群。可以预见,未来CPU中的核心数量还将进一步增长。与此同时,多核架构对传统的系统结构也提出了新的挑战,如存储器壁垒、芯片、板极、系统级均衡设计以及可移植性等方面的问题。 

随着CPU从单核发展为多核,越来越多的程序员也意识到了多线程编程的重要性。多线程编程既可以在多个CPU核心间实现线程级并行,也可以通过超线程等技术更好地利用每一个核心内的资源,充分利用CPU的计算能力。除了直接使用操作系统提供的线

程管理API实现多线程外,还可以通过一些库或者语言扩展等方法实现多线程并行计算。目前常见的多线程编程语言扩展有OpenMP和Intel的TBB(Thread Building Block)等。 

 

图2.1 Intel CPU核心数量变化 

 分类 说明 

SISD(Single Instruction Single

Data) 系统 传统的计算机是单CPU ,同一时刻只能执行一条指令,处理一个

数据,即一个控制流和一个数据流的顺序执行。SISD 也可以并行,只要各CPU 执行不同的指令流,处理不同数据空间的数据流,就

仍是SISD 模式

SIMD (Single Instruction Multiple Data )系统 向量机中,一个指令部件同时控制多个执行部件,一条指令可以

同时操作多个数据,即一个控制流多个数据流。向量机执行操作时,向量处理单元并行处理由同类数据组成的数组,结果按若干个周期的频率输出。相对于细粒度的SIMD ,粗粒度的有SPMD 、

SPMT 等,可视作SIMD 的子类

MISD (Multiple Instructions Single Data )系统 MISD 系统结构只适用于某些特定的算法。MISD 机中,各个处理单元排成线性阵列,对流经的同一数据流,执行不同的指令流,这种应用非常有限

MIMD (Multiple Instruction Multiple Data )系统 多处理器在不同的数据流上执行不同的指令流,与SISD 的本质区

别在于不同处理器处理的指令与数据彼此相关,往往是并行地在执行同一工作的不同部分。高性能服务器与超级计算机大多是

MIMD 机

表5.1 计算机的Flynn分类 

2.2 超级计算机、集群与分布式计算

超级计算机一般指在性能上居于世界领先地位的计算机,通常有成千上万个处理器,以及专门设计的内存和I/O系统。它们采用的架构与通常的个人计算机有很大区别,使用的技术也随着时代和具体应用不断变动。尽管如此,超级计算机与PC的关系仍然十分紧密。一部分超级计算机使用的处理器在PC市场上也能找到;而超级计算机使用的一些技术,如SIMD向量机、多核处理器,以及处理器封装技术等也都已普及到普通计算机中。支持CUDA的GPU可以看成是一个由若干个向量处理器组成的超级计算机,性能也确实可以和小型的超级计算机相比。为了将更多的资源用于计算,过去的超级计算机的界面往往都很简单,往往拆掉显卡以降低功耗。CUDA技术推出以后,越来越多的超级计算机开始安装GPU以提高性能,降低计算成本。 

计算机集群(简称集群)是一种通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作的系统。分布式计算则将大量的计算任务和数据分割成小块,由多台计算机分别计算,在上传运算结果后,将结果统一合并得出结果,组织较为松散。两者一般都采用网络将各个节点连接起来,性价比都高于专门的超级计算机。

例如进行蛋白质折叠计算的Folding@home分布式计算项目,现在有大约十万台计算机参加,计算能力甚至超过了大多数超级计算机。值得一提的是,在该项目中,仅有的11370颗支持CUDA的GPU提供了总计算能力的一半;而运行Windows的CPU共计208268颗,却只能实现198万亿次浮点运算,仅相当于该项目总处理能力的6%。 

目前在超级计算机、集群与分布式计算程序开发中常用的工具是MPI(Message Passing Interface,消息传递接口)。MPI是一个免费和开源库,可以被C/Fortran77/C++/Fortran90调用,几乎得到所有并行计算机制造商的支持。它是一种消息传递编程模型,广泛应用于多类并行机,特别适用于分布式存储的并行机和服务器集群。 

2.3 CPU+GPU异构并行

目前主流计算机的处理能力主要来自CPU和GPU。CPU与GPU一般经北桥通过AGP或者PCI-E总线连接,各自有独立的外部存储器,分别是内存和显存。在一些芯片组中使用的集成GPU没有采用独立的显存芯片,直接从内存中分出一块区域作为显存。Intel和AMD提出的CPU-GPU融合产品还准备直接将CPU和GPU通过QPI或者HT总线连接,集成在一块芯片内。可以预见,受面积、功耗和散热的限制,此类融合产品不大可能集成性能很高的GPU,并且有可能不为GPU提供独立显存。 

传统的CPU+GPU异构并行处理的典型任务是图形实时渲染。在这类应用中,CPU负责根据用户的输入和一定的规则(如游戏的AI)确定在下一帧需要显示哪些物体,以及这些物体的位置,再将这些信息传递给GPU,由GPU绘制这些物体并进行显示。两者的计算是并行的:在GPU绘制当前帧的时候,CPU可以计算下一帧需要绘制的内容。 

在这些处理中,CPU负责的是逻辑性较强的事务计算,GPU则负责计算密集度高的图形渲染。为了满足事务计算的需要,CPU的设计目标是使执行单元能够以很低的延迟获得数据和指令,因此采用了复杂的控制逻辑和分支预测,以及大量的缓存来提高执行效率;而GPU必须在有限的面积上实现很强的计算能力和很高的存储器带宽,因此需要大量执行单元来运行更多相对简单的线程,在当前线程等待数据时就切换到另一个处于就绪状态等待计算的线程。简而言之,CPU对延迟将更敏感,而GPU则侧重于提高整体的数据吞吐量。CPU和GPU的设计目标的不同决定了两者在架构和性能上的巨大差异,具体来说有: 

1.CPU线程与GPU线程 

CPU的一个核心通常在一个时刻只能运行一个线程的指令。CPU的多线程机制通过操作系统提供的API实现,是一种软件粗粒度多线程。当一个线程中断,或者等待某种

资源时,操作系统就保存当前线程的上下文,并装载另外一个线程的上下文。这种机制使得CPU切换线程的代价十分高昂,通常需要数百个时钟周期。某些具有超线程功能的CPU可以将一个物理核心虚拟成多个核心,但每个虚拟核心在一个时刻也只能运行一个线程。 

GPU采用的则是由硬件管理的轻量级线程,可以实现零开销的线程切换。线程的切换在这里成为一件好事:当一个线程因为访问片外存储器或者同步指令开始等待以后,可以立即切换到另外一个处于就绪态的线程,用计算来隐藏延迟。当线程中的计算指令需要的时间较多,而访存相对较少,即计算密集度比较高时,延迟就可以被计算隐藏,而且线程越多,延迟隐藏得更好。 

2.多核与众核 

当前的主流CPU中一般有2~8个核心,每个核心中有3~6条执行流水线。这些核心极采用了很多提高指令级并行的技术,如超标量超深流水线、乱序执行、预测执行,以及大容量缓存等,也采用了如SSE、3Dnow!一类的数据级并行技术。由于缓存和控制逻辑需要很大面积,因此在一块芯片上能够集成的核心数量也就被限制了。 

当前的NVIDIA GPU中有1~30个包含完整前端的流多处理器,每个流多处理器可以看成一个包含8个1D流处理器的SIMD处理器。CUDA就利用了多个流多处理器间的粗粒度任务级或数据级并行,以及流多处理器内的细粒度数据并行。 

尽管GPU的运行频率低于GPU,但更多的执行单元数量还是使GPU能够在浮点处理能力上获得优势,即使是芯片组里集成的低端GPU,在单精度浮点处理能力上也能和主流的CPU打成平手,而主流GPU的性能则可以达到同时期主流CPU性能的10倍左右,如图2.2所示。 

图2.2 GPU与CPU峰值浮点计算能力比较[29] 

3.外部存储器 

GT200 GPU的显存带宽达到了140GB/s,是同时期CPU最高内存带宽的5倍,图2.3是CPU与GPU同期带宽的比较。造成GPU与CPU外部存储器带宽差异的主要原因有两个: 首先,显存中使用的GDDR存储器颗粒与内存的DDR存储器颗粒在技术上基本相同,但显存颗粒是直接固化在显卡的PCB板上的,而内存则为了兼顾可扩展性的需要,必须通过DIMM插槽与主板相连。直接焊在PCB板上的显存的信号完整性问题比通过插槽连接的内存更容易解决,显存的工作频率也通常比使用相同技术的内存要高一些。 

其次,目前的CPU存储器控制器一般基于双通道或者三通道技术的,每个通道位宽64bit;而GPU中则存在数个存储器控制单元,例如GTX280 GPU中就有8个存储器控制器,每个控制两片位宽32bit的显存芯片,使总的存储器位宽达到512bit。这样,尽管内存中的DDR存储器颗粒比显卡上的GDDR存储器颗粒还要多,但CPU能够同时访问的存储器颗粒反而少于GPU。 

 

图2.3 GPU与CPU带宽比较 

4.缓存 

CPU中的缓存主要用于减小访存延迟和节约带宽。缓存在多线程环境下会发生失效反应:在每次线程上下文切换之后,都需要重建缓存上下文,一次缓存失效的代价是几十到上百个时钟周期。同时,为了实现缓存与内存中数据的一致性,还需要复杂的逻辑进行控制。 

在GPU中则没有复杂的缓存体系与替换机制。GPU缓存是只读的,因此也不用考虑缓存一致性问题。GPU缓存的主要功能是用于过滤对存储器控制器的请求,减少对显存的访问。所以GPU上缓存的主要功能不是减小访存延迟,而是节约显存带宽。 

从上面的分析可以看出,GPU的主要设计目标是以大量线程实现面向吞吐量的数据并行计算,适合于处理计算密度高、逻辑分支简单的大规模数据并行任务。而CPU则有复杂的控制逻辑和大容量的缓存减小延迟,能够适应各种不同的情况,尤其擅长复杂逻辑运算。使用GPU处理数据并行任务,而由CPU进行复杂逻辑和事务处理等串行计算,就可以最大限度地利用计算机的处理能力,实现桌面上的超级计算。CPU+GPU并行不只是计算能力的提高,也不只是节省了成本和能源;将高性能计算普及到桌面,使得许多

以往不可能的应用成为了现实,这种灵活性本身就是一种革命性的进步。 

2.4 GPGPU

传统上,GPU的应用被局限于处理图形渲染计算任务,无疑是对计算资源的极大浪费。随着GPU可编程性的不断提高,利用GPU完成通用计算的研究渐渐活跃起来。将GPU用于图形渲染以外领域的计算称为GPGPU(General-purpose computing on graphics processing units,基于GPU的通用计算)。GPGPU计算通常采用CPU+GPU异构模式,由CPU负责执行复杂逻辑处理和事务管理等不适合数据并行的计算,由GPU负责计算密集型的大规模数据并行计算。这种利用GPU强大处理能力和高带宽弥补CPU性能不足的计算方式在发掘计算机潜在的性能,在成本和性价比方面有显著优势。但是,传统的GPGPU受硬件可编程性和开发方式的制约,应用领域受到了限制,开发难度也很大。 

最早的GPGPU开发直接使用了图形学API编程。这种开发方式要求编程人员将数据打包成纹理,将计算任务映射为对纹理的渲染过程,用汇编或者高级着色器语言(如GLSL、Cg、HLSL)编写shader程序,然后通过图形学API(Direct3D、OpenGL)执行。这种"曲线救国"的方式要求编程人员不仅要熟悉自己需要实现的计算和并行算法,还要对图形学硬件和编程接口有深入的了解。由于开发难度大,传统GPGPU没有被广泛应用。 

2003年,斯坦福大学的Ian Buck等人对ANSI C进行扩展,开发了基于NVIDIA Cg的Brook源到源编译器。Brook可以将类似C的brook C语言通过brcc编译器编译为Cg代码,隐藏了利用图形学API实现的细节,大大简化了开发过程。但早期的Brook编译效率很低,并且只能使用像素着色器进行运算。受GPU架构限制,Brook也缺乏有效的数据通信机制。AMD/ATI公司在其GPGPU通用计算产品Stream中采用了Brook的改进版本Brook+作为高级开发语言。Brook+的编译器的工作方式与Brook不同,提高了效率。在2009年推出Brook+1.3以前,Brook+早期版本与Brook相比在语法和编程模型上没有显著改进,同样缺乏有效的线程间数据通信手段。 

2.5 基于GPU结点的超级计算机

2009年10月29日,国防科技大学成功研制出的峰值性能为每秒1206万亿次的“天河一号”超级计算机在湖南长沙亮相。我国成为继美国之后世界上第二个能够研制千万亿次超级计算机的国家。“天河一号”每秒峰值速度达到1206万亿次,Linpack实测性能每秒563.1万亿次,以TOP500列表计世界第五(supercomputing Conference 2009,SC09),这也是中国超级计算机目前为止达到的最高排名成绩。它最大的特点就是使用了5120

个AMD HD4870显卡加速[30]。而早在一年前,同为CPU-GPU异构的东京工业大学的“TSUBAME”(雨燕)就在SC08中排名29位[31]。

2.6 本章小结

本章从性能和架构上比较了CPU和GPU的不同。CPU编程模型一般是串行的,它的目标是通用程序,所以不为特殊功能包含专门的硬件。而GPU可以为特殊任务实现专门硬件,远远比通用可编程方案提供的效率高得多。 

GPU在处理能力和存储带宽上相对CPU有明显优势,在成本和功耗上也不需要付出太大代价。最近几年中,GPU的性能每一年就可以翻倍,大大超过了CPU遵照摩尔定律(每18 ̄24月性能翻倍)的发展速度。目前,主流GPU的单精度浮点处理能力已经达到了同时期CPU的10倍左右,而其外部存储带宽则是CPU的5倍左右;架构上,目前主流的GPU采用了统一架构单元,并写实现了细粒度的线程间通信,大大扩展了应用范围。2006年,随着支持DirectX 10的GPU的发布,GPGPU的普及条件成熟了。 

但是,传统的GPGPU直接使用了图形学API编程,要求编程人员不仅要熟悉自己需要实现的计算和并行算法,还要对图形学硬件和编程接口有深入的了解,因此没有得到广泛应用。 

第三章 CUDA简介

3.1 从GPGPU到CUDA

2007年6月,NVIDIA推出了CUDA(Compute Unified Device Architecture,统一计算设备架构)。CUDA是一种将GPU作为数据并行计算设备的软硬件体系。到目前为止,CUDA的版本已经进行了三次版本提升,功能不断完善,能够很好地支持新硬件的特性。 

CUDA不需要借助于图形学API,并采用了比较容易掌握的类C语言进行开发。开发人员能够从熟悉的C语言比较平稳地从CPU过渡到GPU,而不必重新学习语法。当然,要开发高性能的GPU通用计算程序,开发人员仍然需要掌握并行算法和GPU架构方面的知识。 

与以往的GPU相比,支持CUDA的GPU在架构上有了显著的改进,这两项改进使CUDA架构更加适用于GPU通用计算。一是采用了统一处理架构,可以更加有效地利用过去分布在顶点渲染器和像素渲染器的计算资源;二是引入了片内共享存储器,支持随机写入(scatter)和线程间通信。 

CUDA为开发人员有效利用GPU的强大性能提供了条件。自推出后,CUDA被广泛应用于石油勘测、天文计算、流体力学模拟、分子动力学仿真、生物计算、图像处理、音视频编解码等领域,在很多应用中获得了几倍、几十倍,乃至上百倍的加速比。 

3.2 CUDA编程模型

3.2.1 主机与设备

CUDA编程模型将CPU作为主机(Host),GPU作为协处理器(co-processor)或者称为设备(Device),在一个系统中可以存在一个主机和多个设备。 

在这个模型中,CPU与GPU协同工作各司其职。CPU负责进行对逻辑性强的事物处理和串行计算,GPU则专注于执行高度线程化的并行处理任务。CPU和GPU拥有各自独立的存储器地址空间:主机端的内存和设备端的显存。CUDA对内存的操作与一般的C

相关主题
相关文档 最新文档