使用GPU進行字串匹配 cuda程式設計實現

2021-07-31 07:56:03 字數 3272 閱讀 9872

cuda程式的字尾為.cu,編譯時使用nvcc,其使用方法與gcc相似。例如nvcc test.cu -o test

nvcc的官方文件

1。首先遇到錯誤

fatal error: cutil.h: no such file or directory

kmp.cu(62): error: identifier "cutcreatetimer" is undefined

kmp.cu(63): error: identifier "cutstarttimer" is undefined

kmp.cu(73): error: identifier "cutstoptimer" is undefined

kmp.cu(74): error: identifier "cutgettimervalue" is undefined

kmp.cu(75): error: identifier "cutdeletetimer" is undefined

5 errors detected in

the compilation of

"/tmp/tmpxft_00001b6b_00000000-9_kmp.cpp1.ii".

因此可以基本判定,cutcreatetimer、cutstarttimer、cutstoptimer、cutgettimervalue、cutdeletetimer這幾個函式應該是在cutil.h中支援的。經過查詢,這些的確是cutil.h支援的。而這些函式的功能是記錄程式的執行時間,因此可以尋找cuda中其他記錄時間的方法。

查詢發現event可以做到,使用方法可以參考官方api:

programing guide -> 3.2.5.6 events

我的使用方法如下

cudaevent_t start, stop;

cudaeventcreate(&start);

cudaeventcreate(&stop);

dim3 block(16,16);

dim3 grid(t_len/256+1,1);

cudaeventrecord(start, 0);

kmp_kernel<>>(dd,d_len,t_len,d_text,d_num);

cudamemcpy(num,d_num,sizeof(int),cudamemcpydevicetohost);

cudaeventrecord(stop, 0);

//synchronize

cudaeventsynchronize(start); //optional

cudaeventsynchronize(stop); //wait for the event to be executed!

//calculate time

float dt_ms;

cudaeventelapsedtime(&dt_ms, start, stop);

printf("gpu processing time: %f (ms)\n", dt_ms);

cudaeventdestroy(start);

cudaeventdestroy(stop);

以上參考:

未定義的錯誤解決了

2。然後又遇到編譯錯誤

/tmp/tmpxft_00001c27_00000000-29_kmp_kernel.o: in function `__device_stub__z10kmp_kernelpciis_pi(char*, int, int, char*, int*)':

tmpxft_00001c27_00000000-9_kmp_kernel.cudafe1.cpp:(.text+0x63): multiple definition of `__device_stub__z10kmp_kernelpciis_pi(char*, int, int, char*, int*)'

/tmp/tmpxft_00001c27_00000000-21_kmp.o:tmpxft_00001c27_00000000-4_kmp.cudafe1.cpp:(.text+0x267): first defined here

/tmp/tmpxft_00001c27_00000000-29_kmp_kernel.o: in function `kmp_kernel(char*, int, int, char*, int*)':

tmpxft_00001c27_00000000-9_kmp_kernel.cudafe1.cpp:(.text+0x13c): multiple definition of `kmp_kernel(char*, int, int, char*, int*)'

/tmp/tmpxft_00001c27_00000000-21_kmp.o:tmpxft_00001c27_00000000-4_kmp.cudafe1.cpp:(.text+0x340): first defined here

collect2: error: ld returned 1 exit status

這是因為kmp_kernel被重複定義了

我有三個檔案kmp.cu、kmp_kernel.cu、test_file.h,並且kmp.cu中include了後兩個檔案,編譯命令是

nvcc kmp.cu kmp_kernel.cu -o test
於是報錯。

include了在編譯時就不需要加上該檔名了

在編譯時加上檔名就不需要再include了

參考:3。 使用cpu執行字串匹配程式與gpu字串匹配進行對比

cpu版本的單執行緒實現程式如下:

#include 

#include

#include

char text = "寫上一大堆文字當做查詢庫"; //字串庫

int main()else

if(j>=d_num)

}clock_gettime(clock_monotonic, &tpend);

timedif = 1000*(tpend.tv_sec-tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec)/1000000;

printf("the resule is: %d\n", n);

printf("time: %ldms\n", timedif);

return

0;}

將以上部分新增到主程式即可。

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...

字串匹配

time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...

字串匹配

面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...