999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

利用GPU進行字符串匹配

2009-03-02 09:33:14
新媒體研究 2009年2期

李 磊

[摘要]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.

主站蜘蛛池模板: 国产小视频免费| 国产95在线 | 国产尤物视频在线| 欧美精品H在线播放| 浮力影院国产第一页| 精品国产中文一级毛片在线看| 熟妇人妻无乱码中文字幕真矢织江 | 免费jizz在线播放| 国产女人水多毛片18| 国产精品福利一区二区久久| 91久久大香线蕉| 黄色网页在线观看| 国产高潮视频在线观看| 国产精品亚洲а∨天堂免下载| 免费一级毛片在线观看| 日本日韩欧美| 欧美色图第一页| 毛片基地美国正在播放亚洲 | 免费三A级毛片视频| 四虎AV麻豆| 无码人妻热线精品视频| 伊人久热这里只有精品视频99| 制服丝袜在线视频香蕉| 伊人天堂网| 五月激情婷婷综合| 国产主播一区二区三区| 无码区日韩专区免费系列 | 色AV色 综合网站| 亚洲中文无码h在线观看| 中美日韩在线网免费毛片视频| 全午夜免费一级毛片| 又猛又黄又爽无遮挡的视频网站| 免费一级毛片完整版在线看| yjizz视频最新网站在线| 青青青国产视频| 亚洲中文字幕无码爆乳| 热九九精品| 2020国产在线视精品在| 日韩国产亚洲一区二区在线观看| 国产91无毒不卡在线观看| 久久精品一品道久久精品| 国产精品性| 国产乱子伦手机在线| a色毛片免费视频| 色偷偷综合网| 性做久久久久久久免费看| 青青青国产免费线在| 欧美第一页在线| av午夜福利一片免费看| 91精品啪在线观看国产91| 日本午夜视频在线观看| 亚洲a免费| 亚洲第一视频区| 免费一级大毛片a一观看不卡| 亚洲天堂高清| 无码网站免费观看| 国产精品成人观看视频国产| 永久免费无码日韩视频| 日韩精品一区二区深田咏美| 国产成人1024精品下载| 欧美一级特黄aaaaaa在线看片| 无遮挡国产高潮视频免费观看| 国产精品xxx| 91小视频在线观看免费版高清| 国内精品久久久久久久久久影视| 国产成人无码综合亚洲日韩不卡| 国产亚洲精品自在线| 国产91特黄特色A级毛片| 91免费精品国偷自产在线在线| 欧美日韩午夜| 免费观看亚洲人成网站| 日韩二区三区无| 亚洲国产系列| 成人午夜天| 在线观看国产黄色| 六月婷婷综合| 无码'专区第一页| 亚洲午夜天堂| h视频在线播放| 国产精品女人呻吟在线观看| 色综合日本| 国产免费看久久久|