利用GPU进行字符串匹配

来源 :硅谷 | 被引量 : 0次 | 上传用户:zhuhai2009
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要]GPU通过SIMD(Single Instruction Multiple Data,单指令多数据)对图像数据进行并行处理。字符串的匹配在信息检索、计算机病毒码匹配和生物基因技术领域中都有应用。探讨利用GPU进行字符串的匹配。
  [关键词]GPU BF CUDA
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120055-01
  
  一、引言
  
  NVIDIA公司在1999年发布GeForce 256图形处理芯片时首先提出GPU(Graphic Processing Unit,图形处理芯片)的概念。GPU的32位的浮点渲染精度、向量处理特征和超长流水线结构特点,使它具有对密集性数据的计算能力,在通用计算机上提供一种并行平台。目前,GPU在分布式计算、生物制药、天气预报等非图形数据处理领域都有广泛应用。
  字符串匹配在信息检索、计算机病毒码匹配和生物基因技术领域中都有应用。字符串的匹配算法有很多,比如BF算法、KMP算法、RK算法。
  CUDA(Compute Unified Device Architecture,统一计算设备架构)是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。CUDA的GPU编程语言基于标准的C语言,对大多数程序员来说还是很容易掌握的。
  本文就BF算法在GPU环境下利用CUDA软件开发工具的实现展开讨论。
  
  二、介绍一下CUDA编程的特点
  
  通过CUDA编程时,将GPU看作可以并行执行多个线程的计算设备(compute device)。它作为主CPU的协处理器来运作。应用程序首先被主CPU执行过程,而应用程序数据并行的、计算密集的部分给GPU执行,GPU最后把计算的结果返回给主CPU中的应用程序。即GPU执行的部分函数化。要达到这种效果,可以将这样一个函数编译到GPU设备的指令集合中,并将得到的程序(叫做内核,kernel)下载到GPU设备上。CPU和GPU都保留自己的DRAM,分别称为主机内存(host memory)和设备内存(device memory)。用户可以通过优化的API调用将数据从一个DRAM复制到其他DRAM中,而优化的API调用使用了设备的高性能直接内存访问(DMA)引擎。
  下面是在主CPU下完成的BF朴素匹配算法,C语言描述如下:
  int BFString(char* query , char* subject,)
  { int i , j , k , num= -1;
  int m=strlen(query); //模式串长度
  int n=strlen(subject); //目标串长度
  for(i=0; i<=n-m;i++)
  { j=0; k=i ; //从第i个位置开始搜索字符串subject,看是否
  存在子字符串跟模式串query一样
  while( j< m && subject[k]= = query[j]){k++; j++; }
  if(j= =m) num++;//条件成立,则找到模式串,记录个数加1
  }
  return num; //返回个数
  }
  这个函数里面的形式参数、局部变量都是在内存中定义的,CPU可以直接访问。
  为了体现GPU的并行性,我们把字符串的每次比较交给不同的线程完成。比如thread_0从i=0位置开始,thread_1从i=1位置开始,thread_2从i=2位置开始。。。。。。thread_n从i=n位置开始(假设用n+1个线程来执行);然后thread_0从i=n+1位置开始,thread_1从i=n+2位置开始。。。。这样循环直到所有的搜索都完成。目前GeForce 8800GT一个块(block)最多只能有512个threads。假设一个kernel只由一个block组成。这里需要在CUDA的初始化文件,加入下面的#define语句,定义thread数目。
  #define THREAD_NUM 256
  接着把kernel程序改成如下形式:
  __global__ static void BFString(char * query , char * subject ,int number ,int len_que , int len_sub )
  { //query模式串,subject目标串
   extern __shared__ int shared[];//共享内存空间,保存匹配的个数
  const int tid = threadIdx.x; //获得线程的id
  // const int bid = blockIdx.x;获得block的id,此时block只有一块,故省略
  int i , j , k ;shared[id]=0;
  for(i=tid ;i<=len_sublen_que ; i +=THREAD_NUM)
  { j=0;k=i ;
  while( j< len_que && subject[k]= = query[j]){k++;j++;}
  if(j= =len_que) shared[tid]++;
  }
  __syncthreads(); //同步函数,所有线程到这步等待同步
  if(tid = = 0) {
   for(i = 1; i < THREAD_NUM; i++) shared[0] += shared[tid];
   number = shared[0];//利用线程0来计算匹配的子字符串的个数
  }
  }
  这个函数里面的形式参数和其它变量是在GPU的存储器里面。那么在main()程序中,就需要利用CUDA的cudamalloc()分配GPU的存储器空间和cudamemcpy()复制主存的内容到显存。调用kernel函数后,还要将空间释放(用cudafree()函数)和将number的值复制回主存(用cudamemcpy()函数)。函数的具体操作请查看CUDA相应的文档。
  由于1个block中的thread的个数是有限制的,要想有更多的thread来参与计算,就必须增加block的数目。注意,一个block里面的线程有一个shared memory。block之间的shared memory不能相互访问。比如,我们这个时候在#define THREAD_NUM的位置加上:
  #define BLOCK_NUM 32
  则kernel程序中需要修改的主要是在for循环:
  for(i = bid * THREAD_NUM + tid; i < len_sublen_que ;
  i += BLOCK_NUM * THREAD_NUM)
  { j=0;k=i ;
  while( j< len_que && subject[k]= = query[j]){k++;j++;}
  if(j= =len_que) shared[tid]++;
  }
  这里要注意一点,就是复制结果回去的时候要考虑到BLOCK_NUM个shared[0]。
  
  参考文献:
  [1]张庆丹、戴正华、冯圣中、孙凝晖,基于GPU的串匹配算法研究,计算机应用[J].2006.26(7):1735-1737.
其他文献
[摘要]上标电厂在进行自动化改造、计算机监控系统改造后,大量使用PLC,主要对PLC进行简要的介绍,并对PLC在上标电厂的使用情况、如何正确使用PLC以及PLC程序编写的原则进行介绍和讨论。  [关键词]PLC 水电厂 自动化 应用  中图分类号:TP2文献标识码:A文章编号:1671-7597(2009)0310129-01    一、前言    上标电厂有两台8000KW的冲击式机组,于199
期刊
[摘要]单片机实验是一门设计性、综合性很强的实验,实践性教学环节占有很重要的地位,因此,应认真制定实验教学计划,精心选择实验内容,激发学生的学习兴趣,改革实验教学方法,寓实验过程于理论教学之中,促进理论知识与实际开发技能相结合,积极发挥学生的主体作用,培养学生的实践能力和创新精神。  [关键词]实验教学 单片机 能力培养  中图分类号:G42文献标识码:A文章编号:1671-7597(2009)0
期刊
[摘要]利用DSC技术研究IF钢回复、再结晶、相转变行为,指出第二相粒子对冷变形IF钢间段退火过程的影响,通过定量计算再结晶激活能的方法说明第二相弥散析出对再结晶过程的控制作用。DSC定量分析铁的同素异构转变潜热为10J/mol。  [关键词]差示扫描量热DSC 无间隙原子钢  中图分类号:O59文献标识码:A文章编号:1671-7597(2009)0310122-01    IF钢也称无间隙原子
期刊
[摘要]随着现代科学技术的发展,人类进入信息时代,同时对现代工业安全生产的发展提出更高的要求,工业安全管理信息系统(ISMIS)的产生对适应时代的发展,对提高工业安全生产水平提供广阔的空间。  [关键词]工业安全管理信息系统 概念模型 信息技术  中图分类号:TS4文献标识码:A文章编号:1671-7597(2009)0310125-01    一、引言    工业安全管理信息系统(Industr
期刊
[摘要]从当下社会现象和历史背景下,阐述中国实验建筑曲折的实践探索,评析中国实验建筑在中国现代建筑发展进程中的先锋意义,并就批评在当代中国实验建筑实践的责任进行讨论。  [关键词]实验 先锋 文化价值 批评  中图分类号:J59文献标识码:A文章编号:1671-7597(2009)0310198-02    一、引言:从“侯梁”现象说起    侯梁,1996年毕业于中国广州华南理工大学并获得建筑学
期刊
[摘要]从2008年秋季入学开始,高等学校陆续迎来在网络环境下成长起来的“90后”新生。从网络环境教学入手,通过对“90后”大学生成长环境、自身特点的分析,探索大学网络外语教学的有效途径。  [关键词]“90后”大学生 网络环境 外语教学  中图分类号:G42文献标识码:A文章编号:1671-7597(2009)0310144-01    2008年9月,各大高校陆续迎来了新同学。在新时代背景下成
期刊
[摘要]采用PC+PLC综合自动化控制系统实现对水电站的管理控制,提高系统的管理控制水平及可靠性。对系统的硬件结构及控制功能进行阐述。  [关键词]PC+PLC  中图分类号:TP2文献标识码:A文章编号:1671-7597(2009)0120027-01    一、引言    以微处理机为核心的工业控制装置--可编程序控制器(Programmable Controller简称PLC),体积小、功
期刊
[摘要]随着自动控制领域的高速发展,实现高精度参数采集变得非常重要。实现高精度的参数采集处理目前主要有并行A/D转换和串行A/D转换两种方式,而串行方式以其精度高且成本低廉被广泛应用。它主要有两种有代表性的实现形式(A/D串行、V/F方式)。着重讨论在模拟机参数采集处理应用中采用V/F转换实现稳定性好、抗干扰能力强而且应用简单和成本低廉的良好效果。  [关键词]V/F转换 电荷平衡  中图分类号:
期刊
[摘要]分析在线考试的优点,研究在线考试系统的总体设计,及在线考试系统最终的实现。  [关键词]在线考试系统 B/S模式 ASP Microsoft Office Access2003 数据库  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120044-01    随着Internet/Intranet的迅速发展和广泛普及,建立在其上的远程教育成为现代教育技术未来发展
期刊
[摘要]供配电技术(Engineering of power and distribution)就是研究电力的供应和分配问题。电力,是现代工业生产的主要能源和动力,是人类现代文明的物质技术基础。没有电力,就没有工业现代化,就没有整个国民经济的现代化。浅要介绍当今供配电系统中的自动化装置PLC,希望对广大电力工作者更加了解该技术起到帮助。  [关键词]供配电系统 自动化装置 PLC  中图分类号:T
期刊